c++默认的构造函数或其他函数,以及这个函数的使用或者不使用

在一个空class中,如果你自己没用声明,编译器会为你声明一个copy构造函数,一个copy assignment构造函数,以及一个析构函数,这些函数都是public且inline的。

如果你写class A{}

相当于写了

class A{

A();  //default

~A(); 

A(A & rhs); //copy


A& operatpr=(const A& rhs){} //copy assignment

}


A e1 // default

A e2(e1) ;  copy

e2 = e1; // copy assginment copy


考虑下面的例子

tmplete<class T>

class NameObject

{

public:

NameObjecy(std::string &name , const T& value);

...

private:

std::string &nameValue;

const T objectValue;

}

下面会发生什么情况呢?

std::string newDog("Perse");

std::string oldDog("stach");

NameObject<int> p(newDog , 2);

NameObject<int> s(oldDog , 36);


p = s;  //现在p的变量会发生什么事情??   编译器唯一的做法就是拒绝编译

所以当在一个内含reference成员的class内支持赋值操作, 你必须自己定义copy assignment操作符, 对于内含const 成员的class

 , 也一样。

如果基类将copy assignment 声明为private , 派生类自然无法调用基类中私有的成员函数。



若不想使用编译器自动生成的函数,就该明确的拒绝


最简单的方法就是定义一个基类,并且将copy 构造,copy assignment操作符声明为private就好。


class A

{

protected:

A(){}

~A(){}

private:

A(const A&);

A& operator=(const A&)

};


class B :private A

{

....

}


一定要注意,不能以public继承,以及A的析构函数不一定的为virtual等。

这项技术虽然可以解决copy构造等的禁用,但是也可能导致多重继承。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值