C++中类的构造函数初始值列表解读

目录
  • C++类的构造函数初始值列表
    • 1 通过构造函数初始值列表来初始化成员变量
    • 2 通过构造函数的函数体来初始化成员变量
    • 3 类包含常量或引用成员变量
  • C++类的构造函数的作用

C++类的构造函数初始值列表

1 通过构造函数初始值列表来初始化成员变量

C++中类的构造函数初始值列表可以对类的成员进行初始化。

class myClass{
  public:
  int i;
  myClass(): i(1)
  {
  }
};

其中,类myClass的构造函数中包含了初始值列表,对成员变量i进行初始化。

2 通过构造函数的函数体来初始化成员变量

除了通过构造函数初始值列表来初始化成员变量外,还可以通过构造函数的函数体来初始化成员变量。

class myClass{
  public:
  int i;
  myClass()
  {
    i = 1;
  }
};

此时,成员变量i的初始值是1。

3 类包含常量或引用成员变量

当类包含有常量成员变量或者引用成员变量时

class myClass{
public:
  int i;
  const int ci;
  int& ri;
};

如果类没有定义构造函数,则使用默认的构造函数来创建对象

myClass mc;

此时,编译器会报错,报错信息为“error C2280: “myClass::myClass(void)”: 尝试引用已删除的函数”。因此,需要编写myClass类的构造函数对常量成员变量和引用成员变量进行初始化。

3.1 不能在构造函数的函数体来初始化常量或引用成员变量

在myClass类的构造函数体内对常量或引用成员变量进行初始化

myClass()
{
  i = 1;
  ci = 2;
  ri = i;
}

此时,编译器会报错,报错信息为“ error C2789: “myClass::ci”: 必须初始化常量限定类型的对象”。

3.2 在类的构造函数初始值列表来初始化常量或引用成员变量

myClass():i(1),ci(2),ri(i)
{
}

此时,程序可以成功编译。

C++类的构造函数的作用

构造函数的作用

为了解决给对象成员初始化赋值的问题,C++提供了“构造函数(constructor)”来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。

构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。构造函数不返回任何值,所以,函数没有返回类型。

例如,定义一个C++类,类名是 student,如下:

class student       //以class开头

{   ... };

那么,构造函数的函数名与类名相同,所以,构造函数的函数名是student,例如:

student();                      //没有参数的构造构造函数;

student(char* name);     //带参数的构造函数;

构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。

在讲解构造函数之前,我们先写一个例子,测试构造函数的使用。

测试代码如下:

程序的运行结果有:

在类student中定义了构造函数:

student(char* pn, char* pa, long long n);

构造函数的名称和所在的类同名。在建立对象时自动执行构造函数,它的作用是对定义的对象进行初始化。例如给成员变量赋初值,赋值语句是写在构造函数的函数体中,只有在调用构造函数的时候,才执行这些赋值语句,为当前对象的成员变量赋值。

在上面的例子中,我们定义了stud对象,在定义对象的同时,给对象的成员变量赋值。

定义对象如下:

student stud("wkf", "www.mylinux.vip", 13926572996);

此时,定义stud对象,给对象设置3个数据,根据这些数据的类型,就调用对应的构造函数:

student(char* pn, char* pa, long long n);

所以,把参数设置到对应的构造函数中,如下:

pn = "wkf";

pa = "www.mylinux.vip";

n = 13926572996;

给构造函数的参数设置数据之后,就执行构造函数。

上面是在类内定义构造函数,也可以只在类内对构造函数进行声明,而在类外定义构造函数。在类外定义构造函数,如下:

可以看到,把student(char* pn, char* pa, long long n);构造函数放在类外定义。

有关构造函数的使用,有以下说明:

(1) 构造函数的名称,与类名一样。

(2) 什么时候调用构造函数?定义类对象的时候,开始构建对象,调用类的构造函数。

(3) 构造函数没有返回值,因此,也不需要在定义构造函数时声明函数返回类型,这是它和一般函数的一个重要的不同之点,不能写成:

void student ()

{.....}

构造函数的作用主要是用来对对象进行初始化。

(4) 构造函数是建立对象时由系统自动执行的,而且只执行一次。所以,构造函数不能够由用户调用。

(5) 在构造函数的函数体中不仅可以对成员变量赋初值,而且,可以包含其他语句,例如cout语句。但是,一般不提倡在构造函数中加入与初始化无关的内容。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

    首先,运行下图中的C++代码,输出是什么? 复制代码 代码如下: class A{private: int n1; int n2;public: A(): n2(0) , n1(n2 + 2) { } void Print() {  cout<<"n1:"<<n1<<",n2:"<<n2<<endl; }};int main(void){ A a; a.Print(); return 0;} 答案:输出n1

  • C++构造函数的初始化列表详解

    目录 1.问题 2.解决方法(初始化列表) 3.顺序问题 总结 1.问题 class A { private: int m_a; public: A(int a) { cout << "A(int a)......." << endl; m_a = a; } void print() { cout <<"m_a=" << m_a << endl; } }; class B { private: int m_

  • 关于C++中构造函数初始化成员列表的总结

    1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化 2.初始化列表的顺序? 初始化列表的初始化顺序是依据类成员变量定义的顺序来决定的. 3.关于static const是否应该在初始化成员列表中初始化? static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以不能再初始化列表中进行初始化. 以上就是小编为大

  • c++基础语法:构造函数初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造 顺序是这样的:1.分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错. 复制代码 代码如下: class  ABC  .

  • C++构造函数初始化列表的实现详解

    目录 1.前言 2.初始化列表 3.注意事项 1.前言 初始化就是给变量一个初始值. 初始化的目的是为了让变量有值,防止使用时出现异常. 在构造函数中,有一项重要功能就是对成员变量进行初始化,一般我们采用两个方法: 对成员变量赋值和采用初始化列表 2.初始化列表 在这之前我们来观察一下样例看这两者之间有什么区别: class Date { public: Date(int year = 1900, int month = 1, int date = 1) { _year = year; _mon

  • C++中类的构造函数初始值列表解读

    目录 C++类的构造函数初始值列表 1 通过构造函数初始值列表来初始化成员变量 2 通过构造函数的函数体来初始化成员变量 3 类包含常量或引用成员变量 C++类的构造函数的作用 C++类的构造函数初始值列表 1 通过构造函数初始值列表来初始化成员变量 C++中类的构造函数初始值列表可以对类的成员进行初始化. class myClass{   public:   int i;   myClass(): i(1)   {   } }; 其中,类myClass的构造函数中包含了初始值列表,对成员变量i

  • python创建列表并给列表赋初始值的方法

    本文实例讲述了python创建列表并给列表赋初始值的方法.分享给大家供大家参考.具体如下: aList = [123, 'abc', 4.56, ['inner', 'list'], 7-9j] anotherList = [None, 'something to see here'] print aList print anotherList aListThatStartedEmpty = [] print aListThatStartedEmpty print list('foo') 运行结

  • Java类中字段可以不赋予初始值的原因分析

    目录 Java类中字段可以不赋予初始值的原因 下面是在Java类中各字段的初始值 Java中类属性的初始化 连接阶段又可以分为三个子步骤:验证.准备和解析 而我们这里所说的主动使用 包括 初始化一个类包括两个步骤 Java中final变量为什么在使用前必须要进行初始化 Java类中字段可以不赋予初始值的原因 Java虚拟机会对类的实例对象进行分配内存,在分配内存后,会将内存空间(除了对象头)全部初始化为零值.这就保证了,在类的定义过程中,不给字段赋初始值,实例对象也能有初始值. 下面是在Java

  • C++变量初始化形式及其默认初始值问题

    目录 什么是初始化 初始化方式 默认初始化 值初始化 直接初始化/拷贝初始化 列表初始化 默认初始值 总结 什么是初始化 当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了. 注意:在C++语言中,初始化和赋值是两个完全不同的操作. 初始化:创建变量时赋予其一个初始值. 赋值:把对象的当前值删除,并赋予一个新的值. 而在很多类中,初始化和赋值的区别事关底层效率问题:前者直接初始化数据成员,后者则先初始化再赋值. 初始化方式 默认初始化 在下面情况发生: 在块作用域中定义非静态变量或者数

  • C++之谈谈构造函数的初始化列表

    目录 一.引入 二.初始化的概念区分 三.语法格式及使用 四.注意事项[] 五.总结与提炼 一.引入 我们知道,对于下面这个类A的成员变量_a1和_a2属于[声明],还没有在内存中为其开辟出一块空间以供存放,真正开出空间则是在[定义]的时候,那何时定义呢?也就是使用这个类A去实例化出对象的时候 这个对象的空间被开出来了,难道里面的成员变量就一定开出空间了吗?这一点我们很难去通过调试观察 class A { public: int _a1; //声明 int _a2; }; int main(vo

  • 详解使用angularjs的ng-options时如何设置默认值(初始值)

    这两天我用ng-options过程中遇到的初始值为空白的问题,记得去年就遇到过,怎么解决的忘记了,费了一阵子功夫之后解决了,想记下来,方便遇到同样问题的小伙伴当然还有自己. 1.场景: 就是做一个查询列表的弹窗,其中有一个条件需要用到下拉菜单,数据是用过ajax传递过去的. 2.实现: a.html: <select ng-model="myselect" ng-options="o for o in options"></select> b

  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    使用对象初始值设定项初始化对象 可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数. 下面的示例演示如何将对象初始值设定项用于命名对象.编译器通过先访问默认实例构造函数然后处理成员初始化处理对象初始值设定项.因此,如果默认构造函数在类中声明为 private,那么需要公共访问权的对象初始值设定项将失败. 下面的示例演示如何使用对象初始值设定项初始化新的 StudentName 类型. public class Program { public static void

  • Vue中用props给data赋初始值遇到的问题解决

    前言 前段时间做一个运营活动的项目,上线后产品反馈页面埋点不对,在排查过程中发现,问题竟然是由于Vue中的data初始值导致,而data的初始值来自于props.为方便描述,现将问题抽象如下: 一.现象 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用props初始化data中变量</title>

  • AngularJS控制器controller给模型数据赋初始值的方法

    本文实例讲述了AngularJS控制器controller给模型数据赋初始值的方法.分享给大家供大家参考,具体如下: 之前的文章<AngularJS入门示例之Hello World详解>,很简单的就实现了模型数据和页面显示的自动绑定.现在我们使用控制器,给模型赋初始值.如果使用jQuery来实现变量赋初值,需要在页面加载完成后执行 $("#target").attr("value",selfValue); 使用AngularJS代码如下: <!do

随机推荐