[c++ primer plus]c++ compiler缺省生成了哪些构造函数?关于构造函数的注意事项。

编译器会自动生成以下函数

默认构造函数,如果没有定义构造函数;如果定义了构造函数,则不会生成默认构造函数(不带形式参数的)。
拷贝构造函数,如果没有定义;
赋值操作符,如果没有定义;
默认析构函数,如果没有定义;
地址操作符,如果没有定义;

从基类派生时,如果运用以上函数,情况更加复杂。 

构造函数与析构函数的一些技巧

1. 可以在一个构造函数中用new,另外一个构造函数把指针设为NULL(空),因为delete可以作用于空指针。

2. 使用布局new时,要销毁对象,需要显式调用析构函数:如 pCs1->~class1();

3. 对于属性为const、引用的成员变量,应使用构造函数的参数化列表初使化。

class  Cs1
{
public:
    Cs1(
int val1, int& val2) : iVal(val1), rVal(val2)
    
{
    }

private:
    
const int iVal;
    
int& rVal;
}
;

4. 可以把拷贝构造函数和赋值函数定义到private里,这样一方面避免了编译器生成缺省函数,另一方面因为这些函数成为私有的,就不可能被外界引用,类设计简单化。

class  Cs1
{
public:
private:
    Cs1(
const Cs1& ref)
    
{
    }

    Cs1
& operator=(const Cs1& ref)
    
{
    }

};


Cs1 cs1, cs2;
Cs1 cs3 
=  cs1;  // invalid
cs2  =  cs1;  // invalid

5. 拷贝构造函数产生临时变量吗?

class1 cs1;
class1 cs2 
=  cs1; 
// 不确定是否产生临时对象。有可能仅调用拷贝构造函数;也可能先调用拷贝构造函数产生一个临时对象,之后再调用赋值函数,最后析构临时对象。
class1 cs3(cs1);  // 不产生临时对象。

6. 派生类需要显式调用基类的构造函数码?

首先, C++规定,基类的构造函数一定会被调用,要么你显式指定了调哪个构造函数,要么会编译器自动调默认构造函数。不调构造函数就不可以创建对象。

是不是派生类必须要显式书写构造函数呢?也不是!条件是:如果基类声明了带有形参表的构造函数,并且派生类的对象初始化需要调用基类的带有参数的构造函数,派生类就应当明确声明构造函数。否则其他情况下派生类是不必显式声明的。也就是说派生类在初始化对象的时候,由基类继承下来的成员的初始化会自动由基类的默认形式的构造函数进行相应的初始化工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值