精华内容
下载资源
问答
  • 成员函数初始化列表

    千次阅读 2020-05-20 20:00:43
    1、何时必须用成员初始化列表 a)如果这个成员是个引用 b)如果是个const类型成员 c)如果你这个类是继承一个基类,并且基类中有构造函数,这个构造函数里边还有参数。 d)如果你的成员变量类型是某个类类型,而这个类的...

    1、何时必须用成员初始化列表

    a)如果这个成员是个引用
    b)如果是个const类型成员
    c)如果你这个类是继承一个基类,并且基类中有构造函数,这个构造函数里边还有参数。
    d)如果你的成员变量类型是某个类类型,而这个类的构造函数带参数时;
    

    2、使用初始化列表的优势(提高效率)

    除了必须用初始化列表的场合,我们用初始化列表还有什么其他目的? 有,就是提高程序运行效率。
    对于类类型成员变量xobj放到初始化列表中能够比较明显的看到效率的提升
    但是如果是个简单类型的成员变量 比如 int m_test,其实放在初始化列表或者放在函数体里效率差别不大;
    

    3、初始化列表细节探究

    a)初始化列表中的代码可以看作是被编译器安插到构造函数体中的,只是这些代码有些特殊;
    b)这些代码 是在任何用户自己的构造函数体代码之前被执行的。所以大家要区分开构造函数中的
    用户代码 和 编译器插入的 初始化所属的代码。
    c)这些列表中变量的初始化顺序是 定义顺序,而不是在初始化列表中的顺序。
    不建议在初始化列表中 进行 两个 都在初始化列表中出现的成员之间的初始化

    以上内容是在学习kuangxiang老师的课程所得

    展开全文
  • #include using namespace std; class Desk{ ... /*声明一个有参的构造函数,并用参数的初始化列表对数据成员初始化*/ Desk(int h,int w,int l):height(h),width(w),length(l){} int volume(); private:
    #include <iostream>
    using namespace std;
    class Desk{
    public:
        Desk();//声明一个无参的构造函数
        /*声明一个有参的构造函数,并用参数的初始化列表对数据成员初始化*/
        Desk(int h,int w,int l):height(h),width(w),length(l){}
        int volume();
    private:
        int height,width,length;
    };
    Desk::Desk(){//定义无参的构造函数
        height=2;
        width=3;
        length=4;
    }
    int Desk::volume(){
        return height*width*length;
    }
    int main(){
        Desk desk1;//不指定实参
        cout<<"desk1's volume: "<<desk1.volume()<<endl;
        Desk desk2(1,5,5);//指定实参
        cout<<"desk2's volume: "<<desk2.volume()<<endl;
        return 0;
    }
    

    展开全文
  • c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化 有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后...

    c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化

    有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和变量声明的顺序一样,而与列表中的顺序无关)

    1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 class A 
     5 {
     6 public:
     7     int a = 1;
     8     A() {}
     9     A(int a_):a(a_){}
    10     A(int a_, bool b) :a(4) { a = a_; }
    11 };
    12 
    13 int main()
    14 {
    15     A a1, a2(3), a3(5, true);
    16     cout << "a1.a=" << a1.a << endl;
    17     cout << "a2.a=" << a2.a << endl;
    18     cout << "a3.a=" << a3.a << endl;
    19     system("pause");
    20     return 0;
    21 }
    

    结果如图,可看出,初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的,足以看出初始化的顺序:

    在这里插入图片描述

    另外有人说这种初始化方式破坏了类的抽象性。是的,一定程度上,但是却能带来很大便捷。好比一台机器能够生产某种零件,零件的各个尺寸可以在一定程度任意改变,但是我们并不是每次生产这种零件都需要一个一个地给定每一个参数,然后再生产,机器会自己带有一套“默认”的零件尺寸参数,这样新手可以直接用默认参数生产,除非你知道每一个参数都是干啥的,否则没必要更改。那么也可以在构造函数中给出这一套“默认参数”啊,是的,但是假如你有10个构造函数,那么你每一个都要复制一次所有成员变量的默认参数吗?显然在做重复的无用工作,那么为什么不直接在声明的时候就初始化!


    参考:https://www.cnblogs.com/blog-vincent-0x1F7/p/9668524.html

    展开全文
  • 一、对于实例变量 实例变量初始化过程分析 ...③ 构造函数实例变量初始化 package cn.daywan.test; public class RAMTest { public RAMTest(double price) { System.out.println("②--构造函数");

    一、对于实例变量

    实例变量初始化过程分析
    初始实例变量的有:
    ① 实例变量定义时初始化、
    ② 非静态代码块初始化、
    ③ 构造函数实例变量初始化

    package cn.daywan.test;
    
    public class RAMTest {
    
    	public RAMTest(double price) {
    		System.out.println("②--构造函数");
    		this.price = price;
    	}
    
    	double price = 2.0;// ③--声明语句并赋值
    	
    	{
    		System.out.println("①--非静态语句块");
    		price = 3.4;
    	}
    
    	public static void main(String[] args) {
    		RAMTest t = new RAMTest(100);
    		System.out.println(t.price);
    	}
    }
    执行结果:
    ①--非静态语句块
    ②--构造函数
    100.0

    结论:
    实例变量的初始化语句经过编译器处理后,都会合并到构造器中去,
    其中定义变量语句转换得到的赋值语句、初始化块中的语句转化得到的赋值语句,总是位于构造器的所有语句之前。合并后两种赋值语句的顺序保持他们在源码中的顺序。其中实例变量定义时初始化和非静态代码块初始化的执行顺序与代码顺序相关。

    二、对于静态变量

    静态变量初始化过程分析
    初始静态变量的有:
    ① 静态变量定义时初始化、
    ② 静态代码块初始化
    package cn.daywan.test;
    
    public class RAMTest2 {
    	// ③--声明语句并赋值
    	static double price = 2.0;
    
    	static {
    		System.out.println("①--静态语句块");
    		price = 3.4;
    	}
    
    	public static void main(String[] args) {
    
    		System.out.println(RAMTest2.price);
    	}
    }
    执行结果:
    ①--静态语句块
    3.4

    package cn.daywan.test;
    
    public class RAMTest2 {
    
    	static {
    		System.out.println("①--静态语句块");
    		price = 3.4;
    	}
    
    	// ③--声明语句并赋值
    	static double price = 2.0;
    
    	public static void main(String[] args) {
    
    		System.out.println(RAMTest2.price);
    	}
    }
    执行结果:
    执行结果:
    ①--静态语句块
    2.0

    结论:
    静态变量的两种初始化顺序与代码顺序相关。



    展开全文
  • 数据成员必须在构造函数初始化列表中初始化: 没有默认构造函数的内嵌对象引用类型的数据成员常数据成员
  • 构造函数初始化时必须采用初始化列表一共有三种情况, 1. 没有默认构造函数的类成员对象() 2. (常量成员)需要初始化const修饰的类成员 3. (引用)需要初始化引用成员数据class A { ... private: int a; }; ...
  • 本文最后更新于 2019年 5月 1号 晚上 8点 01分,并同步发布于 : ... 成员赋值初始化 — 微软技术文档 构造函数 — 微软技术文档 成员初始化语法 构造函数 那么这两种方式有什么区别 ? 我们先看一下反编译...
  • c++11 : 以类内成员函数初始化线程

    千次阅读 2018-07-25 09:40:43
    因为 c++ 禁止获取不合格或括号内的非静态成员函数的地址 这是因为 只有在显示的使用&时,才会形成指向类成员的指针 ,并且后面的标识符是 不在括号中 的,即 &qualified-id 如果是 &(qualified-id) 是不能形成指向...
  • 有一个类A,其数据成员如下: class A { ... private: int a; public: const int b;...则构造函数中,成员变量一定要通过初始化列表来初始化的是...构造函数中,成员变量一定要通过初始化列表来初始化的有以下几种...
  • c++ 子类构造函数初始化及父类构造初始化

    万次阅读 多人点赞 2018-08-30 15:58:50
    我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,...因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调...
  • C++构造函数初始化列表

    万次阅读 2018-02-07 19:52:47
    何为构造函数初始化列表 class Sample { public: // 构造函数内部赋值 Sample(int a) { a_ = a; } // 构造函数初始化列表 Sample(int a) : a_(a) { } private: int a_; }; 上面的代码中,Sample类的2...
  • 一,必须在构造函数初始化列表里进行初始化的数据成员有哪些? 下面是一个自定义的Student类 class Address{}; class Student{ private: const int grade; string &name; Address addr; public: Student(int ...
  • 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),...
  • 定义一个类,类中有一个vector成员初始化的时候发现了一个问题理解不了 ![初始化报错](https://img-ask.csdn.net/upload/201707/02/1498983894_308029.png) 使用这种初始化方式报错 ![初始化报错]...
  • C++构造函数初始化

    千次阅读 2018-06-14 10:09:39
    构造函数后面增加冒号一般有三种作用(1)对成员变量的初始化(2)对类成员对象初始化(3)对父类进行初始化示例1-对成员变量的初始化#include &lt;stdlib.h&gt; #include &lt;iostream&gt; using ...
  • 构造函数初始化时必须采用初始化列表一共有三种情况, 1. 需要初始化的数据成员是对象(继承时调用基类构造函数) 2. 需要初始化const修饰的类成员 3. 需要初始化引用成员数据 因为static属于类并不属于具体的...
  • 函数初始化

    千次阅读 2019-06-12 23:34:14
    然后st成员变量初始化结束,执行下一个static。输出1. 继续初始化下一个static 变量b 最后调用magimaFunction 输出4. 在进行static MagimaTest st = new MagimaTest();时,下面的static不进行初始化,需要先将...
  • class C { int a[3]; public: C(int x, int y, int z) : a{x, y, z} { /* ... */ };...如果数组成员构造成本比较高,或者是const的,希望通过初始化列表构造,就很麻烦了。C++03会建议使用指针数组
  • 【C++】 对象、数据成员、常成员函数总结

    千次阅读 多人点赞 2019-03-24 15:07:25
     ◆ 数据成员不能在声明时赋初始值(普通数据成员也是),数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。  ◆ PS:类的成员对象若要传入参数初始化,则必须在...
  • C++构造函数中用参数列表初始化成员

    万次阅读 多人点赞 2015-09-29 14:57:54
    C++构造函数中初始化成员参数列表初始化成员(必须用的原因:对象成员的初始化,const修饰的成员的初始化,引用成员的初始化,子类调用父类的构造函数初始化父类成员)参数列表在构造函数执行之前执行,参数列表中执行...
  • 如果用户定义的构造函数是以参数列表的形式初始化成员变量,则成员变量的初始化顺序是按照成员变量的声明的顺序。 具体看下面的例子和输出结果: #include using namespace std; int i=1; class A { private: ...
  • 既然构造函数初始化列表和构造函数体内赋值都可以对成员变量赋值,那么二者有何区别,是不是二者等效呢?  构造函数可以分两个阶段进行:(1)初始化阶段;(2)普通计算阶段。计算阶段也就是由函数体内...
  • 初始化列表中,如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数。...
  • 成员函数中std:Thread初始化

    千次阅读 2019-02-20 22:09:52
    目前对c++多线程理解还不是很深入,主要是在看《c++并发编程》,...这个也很好理解,在初始化的时候传入do_some_work函数的指针。 但是在看ceph代码看到Timer类中的std::Thread 初始化方式有点不理解。 55 class ti...
  • C++中(const)数据成员初始化

    千次阅读 2013-11-03 01:42:04
    在类中使用const关键字可以修饰数据成员和成员函数或对象,分别称为数据成员、常成员函数对象。 1常量成员 常量成员包括数据成员、静态常数成员和引用。数据成员和引用的初始化只能通过构造函数的成员...
  • 通过构造函数初始化,可以在创建该类对象时动态赋值,更加灵活。 2.代码执行顺序 在类被创建时,成员变量按照声明顺序初始化,然后调用类的构造方法。  执行顺序: 执行父类静态代码执行子类静态代码 初始化...
  • 成员是常量或引用:成员无法赋值,只能被初始化2)从效率上: 如果在类构造函数里赋值:在成员初始化时会调用一次其默认的构造函数,在类构造函数里又会调用一次成员的构造函数再赋值 如果在类构造函数使用初始化...
  • 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b...
  • C++ 类(构造函数成员初始化列表)

    千次阅读 2018-07-21 13:29:52
    构造函数成员初始化列表 构造函数成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A { private: int a; public: A(int a) { this-&gt;a = a; } int getA() { re...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 487,757
精华内容 195,102
关键字:

常成员函数初始化