C++构造函数详解及显式调用构造函数
C++构造函数详解及显式调用构造函数
c++类的构造函数详解
一、 构造函数是干什么的
class Counter
{
public:
// 类Counter的构造函数
/(,);
// 也可以使用下面的形式
Complex c3 = Complex(,);
// 把c3的数据成员的值赋值给c1
// 由于c1已经事先被创立,故此处不会调用任何构造函数
// 只会调用 = 号运算符重载函数
c1 = c3;
// 调用类型转换构造函数
// 系统首先调用类型转换构造函数,,然后调用等号运算符重载,将该临时对象赋值给c1
c2 = ;
// 调用拷贝构造函数( 有下面两种调用方式)
Complex c5(c2);
Complex c4 = c2; // 注意和 = 运算符重载区分,这里等号左边的对象不是事先已经创立,故需要调用拷贝构造函数,参数为c2
//这一点特别重要,这儿是初始化,不是赋值。其实这儿就涉及了C++中的两种初始化的方式:复制初始化和赋值初始化。其中c5采用的是复制初始化,而c4采用的是赋值初始化,这两种方式都是要调用拷贝构造函数的。
区别:
初始化:被初始化的对象正在被创立
赋 值:被赋值的对象已经存在
}
三、思考与测验
1. 仔细观察复制构造函数
Complex(const Complex & c)
{
// 将对象c中的数据成员值复制过来
m_real = ;
m_img = ;
}
为什么函数中可以直接访问对象c的私有成员?
答:〔网上〕因为拷贝构造函数是放在本身这个类里的,而类中的函数可以访问这个类的对象的所有成员,当然包括私有成员了。
2. 挑战题,了解引用与传值的区别
Complex test1(const Complex& c)
{
return c;
}
Complex test2(const Complex c)
{
return c;
}
Complex test3()
{
static Complex c(,);
return c;
}
Complex& test4()
{
static Complex c(,);
return c;
}
void main()
{
Complex a,b;
// 下面函数执行过程中各会调用几次构造函数,调用的是什么构造函数?
test1(a);
test2(a);
b = test3();
b = test4();
test2();
// 下面这条语句会出错吗?
test1(); //test1( Complex( )) 呢?
}
答:
为了便于看构造函数的调用效果,我将类重新改一下,添加一些输出信息,代码如下:
View Code
下面是程序运行结果:
#include <iostream>
using namespace std;
class Complex
{
private :
double m_real;
double m_imag;
int id;
static int counter;
public:
// 无参数构造函数
Complex(void)
{
m_real = ;
m_imag = ;
id=(++counter);
cout<<"Complex(void):id="<<id<<endl;
}
// 一般构造函数〔也称重载构造函数〕
Complex(double real, double imag)
{
m_real = real;
m_imag = imag;
id=(++counter);
cout<<"Complex(double,double):id="<<id<<endl;
}
// 复制构造函数〔也称为拷贝构造函数〕
Complex(const Complex & c)
{
// 将对象c中的数据成员值复制过来
m_real = ;
m_imag = ;
id=(++counter);
cout<<"Complex(const Complex&):id="<<id<<" from id="<<<<endl;
}
// 类型转换构造函数,根据一个指定的类型的对象创立一个本类的对象
Complex(double r
最新C 构造函数详解及显式调用构造函数 来自淘豆网m.daumloan.com转载请标明出处.