c++入门篇八

构造函数的调用规则:

系统会提供三个函数,一个是默认的构造函数(无参,函数体为空),一个是拷贝构造函数(无参,函数体为空),一个是析构函数,对类中非静态成员属性简单值拷贝
如果用户定义了拷贝构造函数,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();
}

原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10683066.html