effective C++笔记之条款45: 弄清C++在幕后为你所写、所调用的函数

本文探讨了C++中若未显式声明某些成员函数(如拷贝构造函数、赋值运算符等),编译器如何为其生成默认版本。特别关注了含有引用或const成员时,需要自行定义赋值运算符的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 如果没有声明下列函数,编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值操作符,一个析构函数,一个取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。
  • 当需要的时候需要,这些函数就会被生成。
  • 生成的这些函数中:
  1. 缺省构造函数和析构函数实际上什么也不做,它们只是让你能够创建和销毁类的对象。(33,M24)。生成的析构函数一般是非虚拟的,除非它所在的类是从一个声明了虚析构函数的基类继承而来。缺省取地址运算符只是返回对象的地址。
  2. 缺省构造函数(赋值操作符)对类的非静态数据成员进行“以成员为单位的”逐一拷贝。
  3. 如果想让一个包含引用成员的类支持赋值,就得自己定义赋值运算符,因为C++没有办法让一个引用指向另一个不同的对象。对于包含const成员的类,因为修改const成员是不合法的,所以也得自己定义赋值操作符。如下所示:

template <class T>
class NamedObject
{
public:
         NameObject(string& name, const T& value);
         …
private:
         string& nameValue;
         const T objectValue;
};
string newDog(“Persephone”);
string oldDog(“Satch”);
NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog, 29);
p = s;

C++将拒绝编译这段代码。所以如果包含引用成员或const成员的类,就应该自己定义赋值操作符。

  • 如果派生类的基类将标准赋值运算符声明为private,编译器也将拒绝为这个派生类生成赋值操作符。因为编译器为派生类生成的赋值操作符也应该处理基类部分,但这样做的话,就得调用对派生类来说无权访问的基类成员函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值