<<C++ Primer Plus(第6版)>>12.1 动态内存和类:知识记录

我的测试环境

所有代码win11的vs2017 版本15.9.24 中测试。

重点知识/结论总结

  1. 虽然原书中提到用等号来初始化值可能会导致调用赋值运算符(多执行赋值的步骤,效率低),但是我实测并没有此问题。当然,这个结果是符合预期的,毕竟明明是没必要去多执行一次赋值运算符来赋值的。但是不排除别的环境,别的VS版本,甚至在别的优化等级下表现不同。所以建议自行测试。
  2. 即便如此,还是建议初始化一个对象使用变量后面用括号赋值初始化的值的方式: StringBad ditto(motto);来规避可能的歧义和不确定的执行流程。
  3. 默认的复制构造函数和默认的赋值运算符都是浅拷贝/浅复制。所以在类中如果有成员变量是指针,指向在构造函数中动态申请的内存的时候,务必自定义复制构造函数和赋值运算符(而不是使用默认的),否则必出现同一块内存重复释放的问题!

正文开始

特殊成员函数

书中原文如下:

12.1.2 特殊成员函数
C++自动提供了下面这些成员函数:
• 默认构造函数,如果没有定义构造函数:
• 默认析构函数,如果没有定义;
• 复制构造函数,如果没有定义;
• 赋值运算符,如果没有定义:
• 地址运算符,如果没有定义。

下面为了方便举例,我们假设有这样一个类:

class A {
	int a;
public:
	int geta(void) { return a; }
	...
};

1. 默认构造函数

如果没有提供任何构造函数,C++将创建默认构造函数,即编译器将提供一个不接受任何参数 ,也不执行任何操作的构造函数。函数形如:

A::A() {
   
    }  // 通过默认构造函数创建的对象的值是未知的

验证代码:

#include<iostream>
using namespace std;

class A {
   
   
	int a;
public:
	int geta(void) {
   
    return a; }
};

#if 1
int main(void) {
   
   
	A a;
	cout << a.geta() << endl;   // 输出结果不一定
}
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值