• 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();
    }

  • 相关阅读:
    ubuntu git配置文件,配置颜色,同义词
    A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
    Lucene索引文件解析之“域”
    模2运算的原理
    Ubuntu aptcache命令查找可用软件包
    crc循环校验原理和实现
    python操作MySQL数据库
    异常:MessageBox.Show 容量超出了最大容量。参数名: capacity
    JavaScript中的 Dictionary 的用法
    IIS设置允许下载.h264文件解决方法
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10683066.html
Copyright © 2020-2023  润新知