深入C++拷贝构造函数的总结详解
拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:
X::X(X);
X::X(X&,inta=1);
X::X(X&,inta=1,b=2);
3.写出以下程序段的输出结果,并说明为什么?如果你都能回答无误的话,那么你已经对拷贝构造函数有了相当的了解。
#include<iostream>
#include<string>
structX{
template<typenameT>
X(T&){std::cout<<"Thisisctor."<<std::endl;}
template<typenameT>
X&operator=(T&){std::cout<<"Thisisctor."<<std::endl;}
};
voidmain(){
Xa(5);
Xb(10.5);
Xc=a;
c=b;
}
解答如下:
a)X&
b)constX&
c)volatileX&
d)constvolatileX&
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.
X::X(constX&); //是拷贝构造函数
X::X(X&,int=1);//是拷贝构造函数
X::X(X&,inta=1,b=2); //是拷贝构造函数
2.类中可以存在超过一个拷贝构造函数,
classX{
public:
X(constX&);
X(X&); //OK
};
classX{
public:
X();
X(X&);
};
constXcx;
Xx=cx; //error
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.这个默认的参数可能为X::X(constX&)或X::X(X&),由编译器根据上下文决定选择哪一个.
默认拷贝构造函数的行为如下:
b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.
c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.
structX{
template<typenameT>
X(constT&); //NOTcopyctor,Tcan"tbeX
template<typenameT>
operator=(constT&); //NOTcopyass"t,Tcan"tbeX
};
原因很简单,
相关文章
- C++中this指针的作用以及用法详解
- C++11 语言特性之原始字符串(Raw String Literals)
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法「建议收藏」
- Dev-C++ FAQ
- 跳跃表(skiplist )详解及其C++编程实现
- 这款编译器能让Python和C++一样快:最高提速百倍,MIT出品
- C++ 并发编程,std::unique_lock与std::lock_guard区别示例详解编程语言
- 【转】c++中的new/delete详解编程语言
- C++聚合和组合详解
- C++ multiset,STL multiset详解
- C++容器适配器简介
- C++ vector删除元素(数据)详解
- C++ deque使用、创建及初始化详解
- C++ piecewise_constant_distribution分段常数分布随机数用法详解
- C++ duration(STL duration)模板用法详解
- 用C驱动MySQL 获取最好的结果(c++ mysql %q)
- 深入C++typedef的用法总结(必看)
- 基于C++list中erase与remove函数的使用详解
- C语言/C++中如何产生随机数
- 标准C++类string的Copy-On-Write技术