zoukankan      html  css  js  c++  java
  • 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();
    }

  • 相关阅读:
    运算符重载
    vmware 下 ubuntu 不能全屏显示 的解决方法
    最优化
    常见算法(logistic回归,随机森林,GBDT和xgboost)
    转:CRF++词性标注
    条件随机场(CRF)理论及应用
    转:RNN(Recurrent Neural Networks)
    RNN(Recurrent Neural Networks)公式推导和实现
    ML、DL相关资源
    机器学习(周志华西瓜书) 参考答案 总目录
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10683066.html
Copyright © 2011-2022 走看看