概念
构造函数是一种特殊的类成员函数,在创建类对象时候调用。有以下特性:1)构造函数名称和类名称一样;2)不声明返回类型;3)可以重载,但是每个函数的参数列表要不同;
主要用途:初始化类对象的成员析构函数:当对象被删除时调用的函数,每个类只有一个析构函数。构造函数没有返回类型,也没有参数,名称和类相同而且前面加上 ~ 。
//如果构造函数使用了new 那么必须提供实用delete的析构函数。
主要用途:释放内存,或者其他处理。
//
// test.h
#ifndef test_h
#define test_h
#include<iostream> // std::cout std::endl
//Circl:: 圆,圆心和半径
class Circl{
private :
double x0,y0;
double r;
public:
Circl(){std::cout<<"begin."<<std::endl;};
Circl(double x,double y,double z){x0=x;y0=y;r=z;};
~Circl(){std::cout<<"end."<<std::endl;};
};
#endif /* test_h */
// main
#include<iostream>
#include "test.h" // test.h
using namespace std;
int main()
{
Circl C0; //对于未被初始化的对象,程序将用默认构造函数来创建
Circl C1(1.0, 1.0, 1.0) // primary form
Circl C2={1.0, 1.0, 1.0}; // C++11
cout<<"middle"<<endl;
return 0;
}
// 不带任何参数的构造函数称为“默认构造函数”,也叫做“缺省构造函数”。
// 如果程序中没有构造函数,程序自动生成一个默认构造函数
// 默认构造函数没有参数,如果有参数则必须要给所有参数都提供默认值
Circl();
Circl(double x=1);
以下为补充内容:
1)使用 初始化列表 来初始化成员数据。
该列表在定义构造函数时候使用,以 : 开头,位置如下
class Circl{
private :
double r; // C++11
public:
//初始化列表
Circl(int x) : r(x) { };
}
2)在构造函数初始化列表里调用其他构造函数,称作“委派构造函数”。
class Circl{
private :
double r {1}; // C++11
void Inti(){.../*其他初始化*/};
public:
// 委派构造函数
Circl(){ Inti();};
Circl(int x) : Circl() {r=x;};
}
3)拷贝构造函数
函数调用时,若以类的对象为形参或返回对象时,编译器会自动生成拷贝构造函数,在已有对象的基础上生成新对象。
拷贝构造函数的参数是语言规定的,是同类对象的常量引用。
作用:用参数对象的内容初始化当前对象
class Circl{
private :
double r;
public:
Circl(const Circl& src){r= src.r; /*...*/};
}
*隐含的复制构造函数:
1)如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数。
这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。
2)如果不希望对象被复制构:
C++98做法:将复制构造函数声明为private,并且不提供函数的实现。
C++11做法:用“=delete”指示编译器不生成默认复制构造函数。
class Point { //Point 类的定义
public:
Point(int xx=0, int yy=0) { x = xx; y = yy; } //构造函数,内联
Point(const Point& p) =delete; //指示编译器不生成默认复制构造函数
private:
int x, y; //私有数据
};
什么时候复制构造函数被调用:
1)定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
2)如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
3) 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。