确保对象在被使用前的初始化

前言

  某个对象若不被初始化,意味着它的执行很有可能导致不确定的结果,这是我们的代码所要坚决避免的情况。

  本文将讲解 C++ 代码中关于对象初始化的方方面面。

成员变量的初始化

  当我们构造一个对象的时候 (不含初始化列表),在进入构造函数之前,其实所有成员变量已经被其所属类型的默认构造函数给初始化了,内置类型则不做任何处理。

  因此,如果你想在构造函数里初始化成员变量,这可未必是个好主意。更好的方法应当是在构造函数的成员初始化列表里对成员变量进行初始化,这样可以避免重复的初始化工作。但请记得在列表中对所有,所有的成员都进行初始化。同时请保证初始化顺序和成员变量声明顺序的一致,这是个好习惯。

  至于 const 或者 引用类型的成员变量,就更不用说了 - 必须用初始化列表的方式初始化,没得选。

  关于成员初始化列表的使用细则,请自行查阅有关 C++ 书籍。

小结

  以正确的方式对对象进行初始化对程序的运行效率,资源节省大有裨益。

时间: 2024-10-13 18:18:10

确保对象在被使用前的初始化的相关文章

读书笔记 effective c++ Item4 确保对象被使用前进行初始化

Item4 确保对象被使用前进行初始化 C++在对象的初始化上是变化无常的,例如看下面的例子: Int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: Class Point { Int x,y; }; Point p; P的数据成员有时候保证能够被初始化(成0),有时候却不能.如果你从不存在未初始化对象的语言中转到c++, 就需要注意了,因为这很重要. 使用未初始化对象的坏处 读取未初始化的值会产生未定义的行为.在一些平台中,仅仅读取未初始化的值就会让

条款47: 确保非局部静态对象在使用前被初始化

class FileSystem { ... }; // 这个类在你 // 的程序库中 FileSystem theFileSystem; // 程序库用户 // 和这个对象交互 ////////////////////////////////////////////////////////// class Directory { // 由程序库的用户创建 public: Directory(); ... }; Directory::Directory() { 通过调用theFileSystem

04——确定对象使用前被初始化

内置类型手动初始化 类类型-构造函数(确保构造函数将对象的每个成员都初始化) 类构造函数初始化列表与函数体内赋值的区别: 效率更高 函数内的赋值语句执行时先执行成员的默认构造函数,再执行copy assignment 初始化列表直接执行一次 copy构造函数 含有const成员.reference成员时需使用初始化列表 基类的初始化 成员的初始化次序: 先基类,够派生类 class成员的初始化次序为其声明次序 04--确定对象使用前被初始化

条款4:确保对象在使用之前就已经被初始化了

构造函数使用本体括号进行复制的情况不叫做初始化而是叫做赋值语句,只有在成员初始化列表中直接进行的 才叫做初始化. ABentry::AbEntry(const std::string & name, const std::string & address, const std::list<PhoneNumber> & phones) :thename(name), address(address), numTimesconsulted(0) {} 初始化列表相比在构造函

条款4:确定对象在被使用前已经被初始化

需要注意三点: 1.手工初始化内置型的非成员对象 2.使用初始化成员列表对付对象的所有成员 3.对"初始化顺序不确实"的问题要注意自己的设计. 这里重点介绍下第三种的情况: 下面的tfs会在外部文件b.cpp中使用,但是当前这种写法不能够保证tfs在b.cpp中使用时已经被初始化了,这样就会造成问题. 1 //a.h 2 class FileSystem 3 { 4 public: 5 int numDisk() const; 6 }; 7 8 extern FileSystem fs

JavaSE8基础 多态 创建子类对象的时候,先对初始化父类

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: class TestFather { public TestFather() { System.out.println("TestFather"); } } class TestSon { public TestSon() { System.out.println("TestSon&quo

C++中类成员使用前需要初始化的重要性

今天写程序的时候,创建了一个结构体: struct BufferObj { char* buf; int bufLen; SOCKADDR_STORAGE addr; int addrLen; struct BufferObj* next; }; 该结构体有一个next指针,本意是这个指针初始的时候应该为NULL,如果有新的BufferObj添加,这个next指针就会指向这个新添加的BufferObj,其实就是一个链表. 程序中有一个生产者线程使用enqueueBufferObj方法向链表里面添

基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式

一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以被类名.静态成员 package com.day06; /** * 人类 * @author Administrator *静态:static *用法:是一个修饰符,用于修饰成员(成员变量,成员函数) *static 修饰的内容,所有对象共享 *当成员被静态修饰后,就多

JS 对象的属性如果没有就初始化

function fuck (inObj, path, parms) { // 一个长得像对象的字符串 var Things = path.split("."); // 即将返回的对象 var obj = inObj; // 不断迭代的key值 var key = ""; // 赋值 var strparms = JSON.stringify(parms); for (var i = 0; i < Things.length; i++) { // 累加key