zoukankan      html  css  js  c++  java
  • c++ 学习记录 构造函数 成员变量的初始化

    参考链接:http://c.biancheng.net/view/2223.html

    在构造函数中对成员变量初始化的方法有俩种

    一:在函数体中对成员变量一一赋值

    二:采用初始化列表,下面是一个简单例子:

    class Student{
    
    private:
    
      char *m_name;
    
      int m_age;
    
      float m_score;
    
    public:
    
      Student(char *name, int age, float score);
    
      void show();
    
    };
    
    //采用初始化列表
    
    Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score)
    
    {//TODO:}

    如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添加了一个冒号:,后面紧跟m_name(name), m_age(age), m_score(score)语句,这个语句的意思相当于函数体内部的m_name = name; m_age = age; m_score = score;语句,也是赋值的意思

    初始化列表可以用于全部成员变量,也可以只用于部分成员变量。下面的示例只对 m_name 使用初始化列表,其他成员变量还是一一赋值:

    Student::Student(char *name, int age, float score): m_name(name){
        m_age = age;
        m_score = score;
    }

    注意,成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关

    #include <iostream>
    using namespace std;
    class Demo{
    private:
        int m_a;
        int m_b;
    public:
        Demo(int b);
        void show();
    };
    Demo::Demo(int b): m_b(b), m_a(m_b){ }
    void Demo::show(){ cout<<m_a<<", "<<m_b<<endl; }
    int main(){
        Demo obj(100);
        obj.show();
        return 0;
    }

    运行结果:
    2130567168, 100

    在初始化列表中,我们将 m_b 放在了 m_a 的前面,看起来是先给 m_b 赋值,再给 m_a 赋值,其实不然!成员变量的赋值顺序由它们在类中的声明顺序决定,在 Demo 类中,我们先声明的 m_a,再声明的 m_b,所以构造函数和下面的代码等价:

    Demo::Demo(int b): m_b(b), m_a(m_b){
        m_a = m_b;
        m_b = b;
    }

    给 m_a 赋值时,m_b 还未被初始化,它的值是不确定的,所以输出的 m_a 的值是一个奇怪的数字;给 m_a 赋值完成后才给 m_b 赋值,此时 m_b 的值才是 100。

    obj 在栈上分配内存,成员变量的初始值是不确定的

    构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用初始化列表

  • 相关阅读:
    jQuery Validate验证框架详解
    struts异常:No result defined for action
    spring问题:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive
    Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
    HttpServletRequest cannot be resolved to a type。
    struts文件异常Included file cannot be found
    JS中获取session中传过来的值对象
    [JS]Math.random()
    用photoshop将图片四角变成圆角
    SSH的jar包下载地址
  • 原文地址:https://www.cnblogs.com/yang220/p/13704255.html
Copyright © 2011-2022 走看看