今天看了c++的构造函数,发现有许多种构造函数,复制构造还有赋值运算符什么的,我想问一下,在实际开发中有必要把他们都写出来吗,大家是不是都写啊,是不是类中元素包含指针就要写啊,菜鸟问题大神别不鸟我啊
c++
------解决方案--------------------------------------------------------
基本上是,如果类中成员有指针的
那么要么你把 赋值和拷贝 屏蔽了 要么就实现了
------解决方案--------------------------------------------------------
构造函数常用的是默认构造函数和拷贝构造函数,这两个经常用到,系统提供默认的,常常被重载。
类中不含有指针的也经常被重载,类中如果含有指针则一定要重载,因为编译器不会给指针赋初值。
A{
A(); //默认构造函数
A(A &a); //拷贝构造函数
}
------解决方案--------------------------------------------------------
不一定,你可以禁止你的class被copy或assign
c++98
class A
{
private: //将copy constructor和copy assignment宣告为private,阻止copy
A(A const&);
A& operator=(A const&);
};
c++11,意思一样
class A
{
public:
A(A const&) = delete;
A& operator=(A const&) = delete;
};
第三种解法,交给object管理
c++11
class A
{
private:
//shared_ptr会负责"shared"资料
std::shared_ptr<int> data_;
}
//....
A a, b;
a = b; //a和b的data_指向同一笔资料
第三种解法的变形,利用stl的container
class A
{
private:
std::vector<int> data_; //自动处理copy和assignment的问题
}
方法一箩筐,哪一种解法好全看你的需求
除非是设计效能很吃紧的基础库
否则现在都不建议用raw pointer管理资源
方法三和四其实都是RAII的范畴
因为RAII的帮助,我自己写的代码已经好久好久
不曾出现过memory leak等memory相关的问题了
如果我不用和别人合作,就不用为memory leak等
鸟问题烦恼了
------解决方案--------------------------------------------------------
看你的实际需要。有时候需要重新实现拷贝构造函数,比如对象里有new出来的内存的时候。单体模式下要把拷贝构造、默认构造之类的隐藏起来。