C++中的6个默认成员函数(我们不写编译器自动生成)

1.构造函数(为了初始化)

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

 其特征如下:

(1)函数名和类名相同

(2)参数可有可无,无返回值

(3)对象实例化时,编译器自动调用对应的构造函数

(4)构造函数可以重载----一个类可以有多个构造函数

编译生成默认构造的特点:

        1.自己写了就不会生成构造函数,自己不写才会生成默认构造

        2.内置类型(基本数据类型 指针也是)的成员不会处理

        3.自定义类型的成员才会处理,回去调用这个成员的默认构造函数

值得注意:

        在类中写无参构造函数、全缺省的构造函数,也称为默认构造函数,但编译器只能调用一个默认构造函数,当我们既写无参又写全缺省多个并存时,会造成调用二义性,编译器会报错,产生冲突。

--------------------------------------------------------------------------------------------------------------------

2.析构函数(为了清理)

析构函数是特殊的成员函数,与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

 其特征如下:

(1)析构函数名是在类名前面加上字符~。

(2)无参数,无返回值

(3)对象生命周期结束时,c++编译器自动调用析构函数

(4)一个类只能有一个析构函数(若没有显示定义,系统会自动生成默认的析构函数),也就是说析构函数不能重载。

值得注意:

        后定义的对象先析构

---------------------------------------------------------------------------------------------------------------------

3.拷贝构造函数

   其特征如下:

(1)拷贝构造函数是构造函数的一个重载形式

(2)拷贝构造函数的参数只有一个且必须是类类型对象的引用,如果拷贝构造函数的参数不是引用类型,使用传值方式编译器直接报错,会导致无限递归调用,因为每次调用拷贝构造函数都会尝试再次复制实参,从而陷入无限循环。

(3)如果未显式定义拷贝构造函数,编译器会默认生成拷贝构造,这是一种浅拷贝,只复制对象的成员变量的值。

(4)如果想实现深拷贝,复制对象所指向的所有资源,对于涉及动态内存分配的类,通常需要自定义深拷贝版本的拷贝构造函数,以确保对象被正确复制

值得注意:

        拷贝构造一般要在前面加const,以避免修改原对象并在传递时避免不必要的保护性复制

------------------------------------------------------------------------------------------------------------------------

4.赋值运算符重载

C++为了增加代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数。

函数名字:关键字 oprator后面接需要重载的运算符符号

函数原型:返回值类型 oprator操作符(参数列表)

注意

(1)不能通过连接其他符号来创建新的操作符

(不呢重载的运算符 “::” ,sizeof”,“?:”,“.*” )

(2)重载操作符必须有一个自定义类型

(3)用于内置类型的运算符,含义不变

(4)5个以上运算符不可重载

(5) 内置类型,值拷贝;自定义类型,调用它的拷贝构造

-----------------------------------------------------------------------------------------------------------------------------

5.const成员函数

const 修饰的“成员函数”称之为const成员函数(注意这里不是说const修饰返回值类型),const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

(1)当一个对象被声明为const(即常量对象),它不能调用非const成员函数。

原因:这是因为常量对象不允许修改其内部状态,而非const成员函数可能会修改对象的状态。在调用非const成员函数时,实际上是通过一个隐含的指向对象的指针(即this指针)来访问对象的成员。而常量对象的this指针是指向常量的指针,因此无法传递给非const修饰的成员函数,从而阻止了对常量对象进行状态修改的行为。简而言之,这是一种保护机制,确保常量对象的状态不会被意外修改。

(2)非const对象可以调用const成员函数,非const对象可以传参给const修饰的指针,权限的缩小是被允许的。

-----------------------------------------------------------------------------------------------------------------------------

6.取地址及const取地址操作符重载

class date

{

public: date* operator&()

{

         return this;

}

const date* operator&() const

{

        return this;

}

private:

int _year;

int _month;

int _day;

};

(1)非const版本的operator&函数返回一个指向当前对象的指针,允许对非const对象使用取地址操作符。

(2)const版本的operator&函数也返回一个指向当前对象的指针,但是标记为const,因此它只能用于const对象。

这种重载是为了让对象在不同的上下文中能够正确地使用取地址操作符,并且符合const语义。这种操作符重载通常不需要手动定义,因为编译器会自动生成默认的操作符重载函数,除非需要进行特定的定制。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码巨匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值