SYSU程设c++(第四周)默认参数的函数声明、构造函数、析构函数、this 指针
创始人
2025-05-29 07:16:03
0

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

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<

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

void func(int n=1, float b=1.2, char c='@'){
    cout< • 效果:一个声明和实现,可匹配多个函数
• 如上述声明可匹配的函数包括:(事实上只能默认从右边开始的连续几个,因为从左边开始的传递不能跳
        • 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
 • 如果用户没有自定义构造函数,则编译会自动生成一个默认构造函数(实际没有效果)。

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

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

        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
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" <

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


 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...