构造函数的调用规则:
系统会提供三个函数,一个是默认的构造函数(无参,函数体为空),一个是拷贝构造函数(无参,函数体为空),一个是析构函数,对类中非静态成员属性简单值拷贝
如果用户定义了拷贝构造函数,C++不会再提供任何默认拷贝函数
当我们提供了有参的构造函数之后,系统就不会给默认提供构造函数了
class Person {
public:
Person(int a) {
}
//下面这个是拷贝的构造函数
//Person(const Person& m) {
//}
};
void test01() {
Person p1(1);//这个是没有问题的,默认会使用有参的构造函数
//Person p2;//这是不可以的,当我们定义了有参的构造函数之后,系统就不会再提供默认的构造函数了
Person p2(p1);//系统会提供拷贝的构造函数
}
初始化列表的基本声明:
//初始化列表的基本使用
class Person {
public:
/*
//无参的构造函数
Person() :m_a(2), m_b(3), m_c(4) {
//后面相当于是赋值操作,m_a=a,m_b=b,m_c=c
cout << "a=" << m_a << "b=" <<m_b << "c" << m_c << endl;
}
*/
//有参的构造函数
//利用初始化列表,初始化数据
//构造函数后面+:属性(参数),属性(参数)...
Person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
}
int m_a;
int m_b;
int m_c;
};
void test() {
Person p1;//调用的是无参数的构造函数
Person p2(10, 3, 4);//调用的是由参数的构造函数
}
int main() {
test();
}
例子:使用有参构造函数,初始化列表操作
// 类.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> using namespace std; #include <string> class Phone { public: Phone(string pn) { phonename = pn; } void setname(string name) { phonename = name;//调用有参构造函数 } string phonename; }; class Game { public: void setname(string name) { gamename = name; } Game(string gn):gamename(gn) {//当有参数进来的时候,调用game的有参构造函数,执行初始化操作>>gamename=gn;赋值 } string gamename; }; class Person { public: Person(string name,string phonename,string gamnename):name(name),m_phone(phonename),m_game(gamnename) { }//在这里相当于是已经传了参数进去,如果是string类型的话相当于是赋值操作name=name,如果是类对象的话相当于是传参数进去,m_phone(phonename) //相当于调用了m_phone类对象有参构造函数,在执行赋值操作,m_game类对象也是调用了构造函数,初始化操作了 //类对象作为类成员的时候,构造对象先将类对象一一构造,把所有的默认构造函数全部执行一遍,然后构造自己,析构的顺序是相反的 string name; Phone m_phone; Game m_game; void playgame() { cout << "姓名:" << name << "手机名称" << m_phone.phonename << "游戏名字:" << m_game.gamename << endl; } }; void test01() { //第二种方式:使用有参构造函数,传入参数(如果是类对象的话,传参进去,调用有参构造函数,进行赋值操作),初始化列表操作 Person p1("yun","LOL","三星");//有参构造函数初始化列表 p1.playgame(); //第一种方式:直接是对类对象里面的属性进行赋值操作 /* Person p1;//使用无参构造函数,对类对象里面的属性(包括类对象)进行操作,类对象的类对象的属性=xxxx p1.m_game.gamename = "LOL"; p1.m_phone.phonename = "三星"; p1.playgame(); */ } int main() { test01(); }