构造、拷贝构造函数基础
来源:互联网 发布:软件开发的过程 编辑:程序博客网 时间:2024/05/01 18:14
构造函数
构造函数可以重载,但是重载可能会出现一些问题,降低了代码的可读性。
例一:
// 类定义
class C1
{
public:
C1(){}; // 默认构造函数
C1(int n){ // 构造函数
cout<<"Constructer using argument 'int n'"<<endl;
};
C1(char *str){ // 构造函数
cout<<"Constructer using argument 'char *str'"<<endl;
};
} c;
// 重载函数声明
void f(int n);
void f(char *str);
void f(C
int main()
{
// 重载函数调用代码
f(10); // 调用f(int n),还是f(C
f("test"); // 调用f(char *str),还是f(C
f(c);
}
在函数调用时应注意,这里调用的分别是f(int n)和f(char *str),因为他们精确匹配重载函数参数。然而代码是给程序员看的,这种写法容易让人产生误解。
例二:
类定义同上,对象定义代码如下
C
C
要避免这种情况,就要使用关键字explicit,将类改写为
class C1
{
explicit C1(){}; // 默认构造函数
explicit C1(int n){ // 构造函数
cout<<"Constructer using argument 'int n'"<<endl;
};
explicit C1(char *str){ // 构造函数
cout<<"Constructer using argument 'char *str'"<<endl;
};
};
这样,以上c1、c2的定义代码将通不过编译,需要改写为
C
C
拷贝构造函数
1. 默认拷贝构造函数可能存在的问题
功能:
只实现数据成员的按位拷贝。如果有内嵌对象,且内嵌对象拥有构造、拷贝构造函数,则也调用内嵌对象的拷贝构造函数。
问题:
1) 不能实现静态数据成员的管理
2) 不能实现深拷贝(有指针的情况下)
2. 什么时候要使用拷贝构造函数
当准备按值传递对象时,才需要拷贝构造函数,如函数参数、函数返回值
3. 如何防止编译器自动生成按位拷贝构造函数
将拷贝构造函数声明为私有的,可以定义,也可以不定以
class NoCC
{
private:
NoCC(const NoCC&); // 可以定义,也可以不定以
// ……
};
int main()
{
NoCC n1;
NoCC n2(n1); // 调用私有拷贝构造函数,编译器将会报错
}
- 构造、拷贝构造函数基础
- C++基础--拷贝构造函数
- C++基础-构造函数/析构函数/拷贝构造
- 构造函数、拷贝构造函数
- 拷贝构造函数,构造函数
- C++基础之拷贝构造函数
- C++ 基础之拷贝构造函数
- c++基础之拷贝构造函数
- 拷贝构造函数--默认拷贝构造函数
- 拷贝构造函数
- 拷贝构造函数
- 浅析拷贝构造函数
- 拷贝构造函数
- 拷贝构造函数
- C++拷贝构造函数
- C++拷贝构造函数
- 拷贝构造函数
- 拷贝构造函数
- 英语积累(转载)
- Hibernate学习(五):session.update
- 关于TCP/IP数据包的截取和分析
- JavaScript学习笔记1---焦点定位在页面表单第一个字段
- 对未来工程师的建议
- 构造、拷贝构造函数基础
- 传上图试试
- 中国软件界就文档格式标准之争集体炮轰微软
- 从eVC4到VS2005的转换
- Javascript中最常用的55个经典技巧
- 在历史的倒影中钓取山水的亮色
- javascript弹出窗口问题总结
- 什么叫红筹股?什么叫蓝筹股?什么叫二线蓝筹股?什么叫权重股?
- 常用正则表达式