美文网首页编程语言
面向对象程序设计第三节-初始化列表(2020-01-27)

面向对象程序设计第三节-初始化列表(2020-01-27)

作者: _NewMoon | 来源:发表于2020-01-27 13:21 被阅读0次

初始化列表 (Initializer List)

我们先定义一个Student类:

class Student {
private:
    string name;
public:
    Student(string s);
};

Student类具有一个数据成员name,还有一个构造函数。
我们再定义这个构造函数,有如下两种方式:

1.初始化列表(Initializer List)

Student::Student(string s) : name(s) {}
  1. 赋值(Assignment)
Student::Student(string s) { name = s;}

这两种方式虽然最终的效果一样,但是在实现过程中存在差异,简单地说,第二种方法虽然合法但是草率,数据成员name将在构造函数体之前执行默认初始化,再进行赋值,而第一种方法直接进行初始化。所以,虽然这两种方法的效果是一样的,但是,有些时候必须使用初始化列表:
当成员是const或者是引用时,必须将其初始化,这里借用一下《C++ Primer》中的例子来说明:

class Constref {
public:
    Constref(int ii);
private:
    int i;
    const int ci;
    int &ri;
};

构造函数如下:

Constref::Constref(int ii)
{   //赋值
    i = ii;
    ci = ii;
    ri = i;
}

我们在vs上看一下编译是否能通过,但是这段代码写完就发出警示了,如下:


warning

所以,如果成员中如果是cons或者是引用的话,还是使用初始化列表,如下:

Constref::Constref(int ii) :i(ii), ci(ii), ri(i) {}

建议: 使用构造函数初始值

在很多类中,初始化和赋值的区别事关底层效率问题:前者直接初始化数据成员,后者则先初始化再赋值。
除了效率问题外更重要的是,一些数据成员必须被初始化,建议读者养成使用构造函数初始值的习惯,这样能避免某些意想不到的编译错误,特别是遇到有的类含有需要构造函数初始值的成员时。

(From 《C++ Primer》)

还有一个问题需要注意的是成员初始化的顺序,看下面一个例子:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

class A {
private:
    int i;
    int j;
public:
    A(int val): j(val), i(j) {  }
    void f();
};

void A::f()
{
    cout << i << " " << j << endl;
}
int main()
{
    A a(10);
    a.f();
    while (1);
    return 0;
}

上面这个例子中,构造函数是先初始化 j 再初始化 i 的,这与声明的顺序不一致,可能凭感觉来说这并没有什么问题,但是,我们运行一下:


result

很明显,i 的初始化产生问题了,从形势上来看,仿佛是先用val初始化了j,再用 j 初始化 i ,实际上,成员的初始化顺序与它们在类定义中的出现顺序一致,即 i 先被初始化,因此这个初始值的效果是试图用未定义的值 j 来初始化 i ,这当然会出现一些无法预料的结果,所以,最好令构造函数初始值的初始顺序与成员声明的顺序一致,并且尽量避免使用某些成员初始化其他成员

相关文章

  • 面向对象程序设计第三节-初始化列表(2020-01-27)

    初始化列表 (Initializer List) 我们先定义一个Student类: Student类具有一...

  • 第四章 对象与类

    1 面向对象程序设计概述 面向对象程序设计(简称OOP)是当今主流的程序设计范型 Java是完全面向对象的,必须熟...

  • 《软件工程》笔记7

    面向对象的实现 面向对象的程序设计最好还是选用面向对象的编程语言。 良好的程序设计风格对于面向对象实现来说格外重要...

  • 《Java核心技术卷 I》之 Java对象与类

    Java对象与类 面向对象程序设计 面向对象程序设计,简称OOP,Java语言就是完全面向对象的。 类 类(cla...

  • JavaScript面向对象编程指南--读书笔记(上)

    第一章:面向对象的JavaScript 面向对象的程序设计 面向对象程序设计(oop)中最常用到的概念: 对象、方...

  • oc编程思想

    面向对象概念 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一...

  • 编程语言基础概念1

    什么是面向对象? 面向对象:指在程序设计中采用封装、继承、多态等设计方法。 什么是面向过程? 面向过程:程序设计按...

  • python面向对象编程

    面向对象编程(一) 1、面向过程程序设计与面向对象程序设计: 面向过程的程序设计把计算机程序视为一系列的命令集合,...

  • 面向对象

    title:面向对象tags: 基础,Java 面向对象 面向对象程序设计简介 面向对象的基本思想是使用类、对象、...

  • 「JS」面向对象

    面向对象程序设计方法面向过程面向对象概念基本特点 JavaScript 面向对象constructor自定义构造器...

网友评论

    本文标题:面向对象程序设计第三节-初始化列表(2020-01-27)

    本文链接:https://www.haomeiwen.com/subject/oqwsthtx.html