C++之class再分析

2021-06-06 03:02

阅读:447

标签:析构函数   目标   形参   成员   更改   type   调用   size   赋值运算符重载   

一个空类,编辑器会实现几个默认函数

(有的说法是4个,有的说法是6个)
一个空类,会有一个默认占位大小,sizeof的结果是1
sizeof(A) > 0 是因为标准规定完整对象的大小为正数。
四个默认函数

  • 构造函数
  • 析构函数
  • 拷贝构造函数
  • 赋值运算符重载函数
    下面这两个没有被提及
  • 取地址运算符重载函数
  • 去地址运算符重载函数const

所以合理的回答应该是 6个默认函数,编译器会按需要实现。一旦程序员干涉了(声明,定义都算),编译器将不再生成默认版本
常见的比如:将拷贝构造函数声明为private,以禁止编译器生成默认版本,同时禁止本类的拷贝行为

拷贝构造函数

People(const People&p);
  1) 为什么必须是当前类的引用呢?
如果拷贝构造函数的参数不是当前类的引用,而是当前类的对象,那么在调用拷贝构造函数时,会将另外一个对象直接传递给形参,这本身就是一次拷贝,会再次调用拷贝构造函数,然后又将一个对象直接传递给了形参,将继续调用拷贝构造函数……这个过程会一直持续下去,没有尽头,陷入死循环。
  2) 为什么是 const 引用呢?
拷贝构造函数的目的是用其它对象的数据来初始化当前对象,并没有期望更改其它对象的数据,添加 const 限制后,这个含义更加明确了。

深拷贝和浅拷贝

将对象所持有的其它资源(一般是程序员进行了新的内存开辟)一并拷贝的行为叫做深拷贝,我们必须显式地定义拷贝构造函数才能达到深拷贝的目的。
如果不实现的话,仅仅只会拷贝指针,不会拷贝指针指向的内存对象。

转换构造函数

将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor)。转换构造函数也是一种构造函数,它遵循构造函数的一般规则。转换构造函数只有一个参数。
People(int age): m_Age(age), m_Name(""){ } //转换构造函数

类型转换函数(给类类型提供转为其他类型的机会)

和转换构造函数的作用刚好相反

  1. type 可以是内置类型、类类型以及由 typedef 定义的类型别名,任何可作为函数返回类型的类型(void 除外)都能够被支持。一般而言,不允许转换为数组或函数类型,转换为指针类型或引用类型是可以的。
  2. 类型转换函数一般不会更改被转换的对象,所以通常被定义为 const 成员。
  3. 类型转换函数可以被继承,可以是虚函数。
  4. 一个类虽然可以有多个类型转换函数(类似于函数重载),但是如果多个类型转换函数要转换的目标类型本身又可以相互转换(类型相近),那么有时候就会产生二义性

C++之class再分析

标签:析构函数   目标   形参   成员   更改   type   调用   size   赋值运算符重载   

原文地址:https://www.cnblogs.com/ming-fei/p/14616816.html


评论


亲,登录后才可以留言!