SYSU程设c++(第四周)默认参数的函数声明、构造函数、析构函数、this 指针

可变参数与没有形参的申明:

C语言:

        C语言没有bool类型,C99 定义了 bool 类型,并通过 stdbool.h 实现与 C++兼容

        • func(); 表示可变参数
        • 如果想表示没有形参,则必须显式声明 func(void);
C++语言:
        • func();表示没有形参,等价于 func(void);
        • 使用 "…" 标点符号表示可变参数

默认参数的函数声明:

C语言:不支持函数默认参数和值
C++语言:

//带默认参数的函数声明(要单独写出)
void func(int n=1, float b=1.2, char c='@'); 
void func(int n, float b, char c){
    cout<<n<<", "<<b<<", "<<c<<endl; } //函数实现

或者也可以把默认声明和函数实现写在一起:

void func(int n=1, float b=1.2, char c='@'){
    cout<<n<<", "<<b<<", "<<c<<endl;}
• 效果:一个声明和实现,可匹配多个函数
• 如上述声明可匹配的函数包括:(事实上只能默认从右边开始的连续几个,因为从左边开始的传递不能跳
        • func()
        • func(int)
        • func(int,float)
        • func(int,float,char)

    例如:

            func();             //func(1,1.2,'@')
            func(10);           //func(10,1.2,'@')
            func(20, 9.8);      //func(20,9.8,'@')
            func(30, 3.5, '#'); //func(30,3.5,'#')

私有成员的访问:

• 只有友元函数可以访问私有成员。(友元函数是虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权)
• class的所有成员默认私有(如果未使用修饰符)。

构造函数:

 • 类的构造函数是类的一种特殊的成员函数,每次创建类的一个新对象时会自动执行它,完成初始化等逻辑。
 • 构造函数的名称与类的名称是完全相同并且不能返回任何类型,定义时不要在函数名前写void
 • 如果用户没有自定义构造函数,则编译会自动生成一个默认构造函数(实际没有效果)。

扫描二维码关注公众号,回复: 15815819 查看本文章

 • 构造函数在创建该类的新对象时,会自动调用执行

 • 构造函数也可以带有参数,这样在创建对象时就可使用参数构造对象。
注意:用户如果只定义了有参构造函数,这时调用无参构造会出错(除非函数重载,既定义有参也定义无参)

        Line line(10.0); 创建对象时,自动执行构造函数
        //Line line1;  //如果只定义了有参构造函数就会Error,因为没有给出参数

 • 构造函数也能使用默认实参

Line(double len = 0) {
        length = len;
        std::cout << "Object is being created, length = " << len << std::endl;
}

这时以下新建对象都没问题

Line line1, line2=10; line3(10);

•构造函数可以是公有的、私有的、保护的,但析构函数只能是公有的

析构函数:

 • 析构函数只能是公有的,因为对象生命周期结束后,系统会调用,如果不是公有的则会引发错误

 • 类的析构函数是类的一种特殊的成员函数,它会在对象被释放前自动执行。

 • 析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。

 • 如果用户没有自定义构造函数,则编译会自动生成一个默认析构函数(实际没有效果)
 • 析构函数有助于在跳出程序前释放资源(比如遇到return 0要释放对象时) (比如走出大括号时)

 • 多个对象在同一层,则跳出这层时,先被创建的会最后被析构

this 指针:

• 每一个对象都能通过 this 指针来访问自己的地址。
this 指针是所有成员函数的隐含参数,不需要定义就拥有。
• 在成员函数内部,this->可以用来指向调用对象。
友元函数没有 this 指针,因为友元不是类的成员。
static 成员不能使用 this,因为它不属于任一对象, 应使用类名::成员

• 当成员函数中的参数与数据成员重名时, 必须用 this 访问数据成员

#include <iostream>
using namespace std;
class Box {
public:
        // 构造函数定义
        Box(double l=2.0, double b=2.0, double h=2.0)

        {
                cout <<"Constructor called." << endl;
                length = l;
                breadth = b;
                height = h;
        }
        double Volume() {
                return length * breadth * height;
        }
        int compare(Box box) {
                return this->Volume() > box.Volume();  //this的用法,this指向的Volume是Box1的
}
private:
        double length; // Length of a box
        double breadth; // Breadth of a box
        double height; // Height of a box
};

int main(void)

{
        Box Box1(3.3, 1.2, 1.5); // Declare box1
        Box Box2(8.5, 6.0, 2.0); // Declare box2
        if(Box1.compare(Box2))  cout << "Box2 is smaller than Box1" <<endl; 

                else cout << "Box2 is equal to or larger than Box1" <<endl;
        return 0;
}


 

猜你喜欢

转载自blog.csdn.net/jz_terry/article/details/129586072