构造函数初始化列表----主要为解决const变量的赋值而生

形式为

类内定义    Student:m_name("jo"),age(10){...}

类外定义    Student::Student(string name,int age):m_name(name),m_age(age){...}

注意:1)可以同时给多个数据赋默认值,以 逗号 隔开;

      2)只能使用括号进行初始值赋值;

   3)最后大括号{}内可以加其他函数---即初始化列表只能用于构造函数,且必须先于构造函数执行;

      4)大括号{}结尾没有标点符号

===>为何需要初始化列表,而不是依靠构造函数来完成呢?

    --->初始化列表可以为const变量进行赋值,而构造函数不可。

  

使用示例:

class Student{
public:
  Student(string names="TTT",int ages=1000);    //赋默认值
  void setname(string name);
  void getAge();
private:
  string m_name;
  const int m_age;
};

Student::Student(string names,int ages):m_name(names),m_age(ages){   //更改name和age,其中age为const

                                       类型,但仍可更改,此即构造函数

                                        初始化列表的特殊用处;

  cout<<"default name"<<" "<<m_name<<endl;
  cout<<"default age"<<" "<<m_age<<endl;
}

void Student::setname(string name){
  m_name=name;
}

void Student::getAge(){
  cout<<m_age;
}

int main(){

  Student jo;                        //此时jo将为默认值m_name="TTT",m_age=1000;
  Student jo("Mary",9999);  //此时jo的name age 将同步更改;
  jo.setname("yoyo");
  return 0;
}

原文地址:https://www.cnblogs.com/dart2100/p/8277809.html

时间: 2024-08-29 20:05:07

构造函数初始化列表----主要为解决const变量的赋值而生的相关文章

构造函数初始化列表和构造函数体内赋值

#include <iostream> using namespace std; class A{ public: A(int a,string str) { m_a = a; m_str = str; } //A(int a,string str):m_a(a),m_str(str){} void print() { cout << m_a << ' '<< m_str<< endl; } private: int m_a; string m_

const成员或者引用成员必须使用构造函数初始化列表的方式

#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2512: 'A' : no appropriate default constructor available;如果将const去掉就没错了! #include<iostream.h> class A { public: const int a; int b; A(int x):a(x){} };

C++构造函数初始化列表与赋值

C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化列表和构造函数体内赋值,基本上没多大区别,效率差异也不大,但两者不能共存: class Student { public: Student(char *name, int age): //A初始化列表 m_name(name), m_age(age) { } Student(char *name,

转:C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public:     int a;     float b;     //构造函数初始化列表     CExample(): a(0),b(8.8)     {}     //构造函数内部赋值     CExample()     {         a=0;         b=8.8;     } }; 上面的例子中两个构造函数的结果是一样

C++之类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class Example { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } }; 例子中两个构造函数的结果是一样的.上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员:而没使用初始化列表的构造函数是对类的成员赋值

c++构造函数初始化列表

对象初始化列表出现原因 1) 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数.这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错. 2) 当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的. #include <iostream>

C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=0;        b=8.8;    }}; 上面的例子中两个构造函数的结果是一样的.上面的构造函数(使用初

C++类构造函数初始化列表(转)

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public:     int a;     float b;     //构造函数初始化列表     CExample(): a(0),b(8.8)     {}     //构造函数内部赋值     CExample()     {         a=0;         b=8.8;     } }; 上面的例子中两个构造函数的结果是一样的.上面的构造函数(使用初始化

构造函数初始化列表

构造函数初始化列表有时是必要的.虽然构造函数分为初始化和计算阶段,使用初始化构造函数列表效率要高一些,这是其一,而且有些情况下必须使用,下面是一例, 1 class Foo 2 { 3 public: 4 Foo(int x, int y): a(x), b(y) {} 5 6 private: 7 int a; 8 int b; 9 }; 10 11 class Bar 12 { 13 public: 14 Bar(): foo(10, 10) {} 15 private: 16 Foo fo