精华内容
下载资源
问答
  • 类内初始化
    千次阅读
    2019-09-18 15:14:54

     

    类内初始化

    在C++11,我么可以为类内成员变量提供一个初始值,则我们在创建对象的时候,这个初始值就用来初始化该成员变量。

    enum LineStyle{
       lsSolid,
       lsDash,
       lsDot,   
    
    };
    class Rect
    {
     public:
        Rect() :left{0}, top{0}, right{0}, bottom{0},style{lsSolid}
          { }
        Rect(int l, int t, int r, int b)
           :left{l}, top{t}, right{r}, bottom{b},style{lsSolid}
          { }
        Rect(int l, int t, int r, int b, LineStyle ls)
           :left{l}, top{t}, right{r}, bottom{b},style{ls}
          { }
    private:
       int top;
       int left;
       int right;
       int bottom;
       LineStyle style;   
    };
    
    这算是正常不过的代码,但是有一个不算是问题的问题:初期值为缺省值的数据包成员也需要在构造函数里指定,感觉不好。

    C++11中引入了类内初始化器,以减少构造函数和初始化代码的数量。

    class Rect
    
    {
       public:
         Rect(int l, int t, int r, int b)
                     :left{l}, top{t}, right{r}, bottom{b}
       {  }
    
       Rect(int l, int t, int r, int b, LineStyle ls)
           :left{l}, top{t}, right{r}, bottom{b},style{ls}
       {  }
    
    private:
       int top{0};
       int left{0};
       int right{0};
       int bottom{0};
       LineStyle style{lsSolid};   
    };
    
    类内初始化之后,构造函数只需要负责和缺省值不同的部分就好,代码精炼很多了。

     

    更多相关内容
  • C++中类初始值列表与类内初始化

    千次阅读 2020-09-22 12:18:56
    的构造函数的作用是对其成员进行初始化。而在构造函数中可以使用初始值列表为新创建的对象的成员进行赋值。 1 初始值列表 在的构造函数名之后紧跟着冒号,冒号后面是要初始化的成员名,之后是圆括号或者花括号...

    类的构造函数的作用是对其成员进行初始化。而在构造函数中可以使用初始值列表为新创建的对象的成员进行赋值。

    1 初始值列表

    在类的构造函数名之后紧跟着冒号,冒号后面是要初始化的成员名,之后是圆括号或者花括号括起来的初始值。这样的结构就是构造函数的初始值列表,如下所示。

    class A
    {
      public:
        A() :a(1),b(2) {};
        int a;
        int b;
    };

    其中,自定义类A具有一个包含了初始值列表的构造函数,使用该构造函数创建对象时,该对象的成员变量a的值是1,b的值是2。

    2 类内初始化

    对于“1 初始值列表”中提到的自定义类A,如果其还存在多个构造函数,

    A(int i) :a(1),b(2) {};
    A(int i, int j) :a(1),b(2) {};
    A(int i, int j, int z) :a(1),b(2) {};

    多个构造函数都包含了相同的初始值列表,代码看上去有些冗长。此时可以使用类内初始化的方法对其进行简化。

    类内初始化指的是在定义类的成员时对其赋初值,赋初值的方式有两种:使用等号赋值和使用大括号赋值。

    class A
    {
    
    public:
    .....
    
      int a = 1;
      int b{ 2 };
    };

    此时,对于之前提到的包含初始值列表的构造函数,就可以简写成如下格式

    A(){};
    A(int i) {};
    A(int i, int j){};
    A(int i, int j, int z)  {};

    之后无论使用哪一种构造方法来产生该类的对象,这个对象的a和b的值分别是1和2。需要注意的是,类内初始化是C++11的新属性

    展开全文
  • C++类内初始值的初始化形式

    千次阅读 2022-01-21 12:18:17
    C++类内初始值的初始化形式一.不能用圆括号给类内初始值的原因二.=和花括号{}初始化的区别1.内置类型和类型2.模板先看初始化列表{}:再看=的初始化过程:==总结:==三.类内初始值的初始化列表{}方式 C++11规定,...

    C++11规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。像下面这样,cursor和height的类内初始值均为0。

    class Screen
    {
    private:
    	int cursor = 0;
    	int height = 0;
    };
    

    一.不能用圆括号给类内初始值的原因

    C++ primer(第5版)中写道:类内初始值的提供必需以=或者花括号{}的形式不能用园括号()

    关于这一点,可以参考网上的一个说法,如下:
    由于无法避免下面的这种情况,这相当于对于int z(int);函数的声明,所以C++把用圆括号进行类内初始值定义为非法。

    class Widget 
    {
    private: 
      typedef int x;  
      int z(x);
    };
    

    二.=和花括号{}初始化的区别

    1.内置类型和类类型

    对于这两者而言,=和{}初始化的区别不大,测试如下。

    #include <iostream>     // std::cout
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main() 
    {
    	std::cout << "*****内置类型*****" << std::endl;
    
    	int ival = 1;
    
    	int ival2{ 1 };
    	int ival3 = { 1 };//实际上同ival2{ 1 }一样
    
    	std::cout <<"ival = " <<ival << std::endl;
    	std::cout <<"ival2 = " <<ival2 << std::endl;
    	std::cout <<"ival3 = " << ival3 << std::endl;
    
    	std::cout << "*****类*****" << std::endl;
    
    	string str = "aa";
    
    	string str2{ "aa" };
    	string str3 = { "aa" };//实际上同str2{ "aa" }一样
    
    	std::cout << "str = " << str << std::endl;
    	std::cout << "str2 = " << str2 << std::endl;
    	std::cout << "str3 = " << str3 << std::endl;
    
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    2.类模板

    对于类模板而言,我们可以看看实际上初始化列表{}和=初始化的过程:

    先看初始化列表{}:

    std::vector<std::string> vs{ "ssss" ,"dddd"};
    

    可以看到,上面的初始化的最后一步是在vector中插入初始化列表中元素

    再看=的初始化过程:

    因为它实际上是一个拷贝构造的过程,所以=的右边必须是一个同类型的值,如下所示。vs3可以看成是一个’std::vector’类型的变量,那么只能用’std::vector’类型的变量来初始化它,比如下面的vs_tmp。

    	std::vector<string> vs_tmp;
    	std::vector<string> vs3 = vs_tmp;
    

    注意,千万不能这样:std::vector<string> vs2 = "eee";
    上述初始化最后调用的是vector的拷贝构造函数,如下:
    在这里插入图片描述

    总结:

    • 初始化列表,列表中的元素就是模板的元素,如vector<string> tmp_vec= {"ddd","www"}
    • =初始化,只能用同类型,如只能用vector类型初始化vector类型

    三.类内初始值的初始化列表{}方式

    我在实际上调试时发现如下这样的一个问题:类内初始值的初始化列表{}方式编译器会报错。定义的类如下。
    这让我很迷惑,因为在上面的测试中是可以的?后来才发现,因为我用的是VS2013,而它并不是完全支持C++11标准,所以对类内初始值用初始化列表的形式可能还不支持,换一个编译器后,不再报错。

    class Wind_mgr
    {
    public:
    	void putsData()
    	{
    		str.push_back("aaa");
    	}
    private:
    	std::vector<std::string> str{"bbb"};//Error,无法从“const char [4]”转换为“const std::allocator<_Ty>”
    };
    

    最后附上vector的几种初始化形式:

    初始化格式说明
    vector v1生成一个空vector
    vector v2(V1)v2包含v1的所有元素副本
    vector v2 = v1等价于V2(V1)
    vector v3(n,val)v3被初始化为n个val值,即v3有n个重复的元素
    vector v4(n)v4是一个有n个元素的vector,只是n个元素均为值初始化值
    vector v5{a,b,c…}v5的大小就是初始化列表的大小,每个元素的值是初始化列表的值
    vector v5 = {a,b,c…}等价于V5{a,b,c…}
    vector v6 (first, last)将迭代器[first,last)区间的元素拷贝到v6
    展开全文
  • 声明的外部进行初始化 。例如上面的代码:int Student::m_total = 0; 2.static成员变量和普通static变量一样,都在内存分区的 全局数据区 分配内存,到程序结束后释放。这就意味着,static 成员变量不随对象的...

    C++中的static成员变量主要用来为多个对象共享数据

    例:

    复制代码
    #include <iostream>
    using namespace std;
    class Student{
    public:
        Student(char *name, int age, float score);
        void show();
    private:
        static int m_total;  //静态成员变量
    private:
        char *m_name;
        int m_age;
        float m_score;
    };
    //初始化静态成员变量
    int Student::m_total = 0;
    Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
        m_total++;  //操作静态成员变量
    }
    void Student::show(){
        cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"(当前共有"<<m_total<<"名学生)"<<endl;
    }
    int main(){
        //创建匿名对象
        (new Student("小明", 15, 90)) -> show();
        (new Student("李磊", 16, 80)) -> show();
        (new Student("张华", 16, 99)) -> show();
        (new Student("王康", 14, 60)) -> show();
        return 0;
    }
    复制代码

    运行结果:
    小明的年龄是15,成绩是90(当前共有1名学生)
    李磊的年龄是16,成绩是80(当前共有2名学生)
    张华的年龄是16,成绩是99(当前共有3名学生)
    王康的年龄是14,成绩是60(当前共有4名学生)

    需要注意的是:

    1.static成员变量必须在类声明的外部进行初始化。例如上面的代码:int Student::m_total = 0;

    2.static成员变量和普通static变量一样,都在内存分区的全局数据区分配内存,到程序结束后释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存

    转载于:https://www.cnblogs.com/pogeba/p/11264388.html

    展开全文
  • C++11新特性(8)- 类内初始化

    千次阅读 2018-04-11 20:33:49
    重复的初始化代码考察下面的代码:enum LineStyle{ lsSolid, lsDash, lsDot, };class Rect{public: Rect() :left{0}, top{0}, right{0}, bottom{} ,style{lsSolid} { } Rect(int l, int t, int ...
  • 我们明确在初始化一个派生对象时,会先调用基类的构造函数,然后再调用派生的构造函数;在回收资源的时候,先调用派生的析构函数,再调用基类的析构函数。 我们在初始化一个派生的对象时,如何去初始化一个...
  • 错误: ISO C++ 不允许在类内初始化非常量静态成员  今天开始学C++ primer,在牵扯到Sales_item.h头文件时,出现了一些问题(和C++11新特性相关),当前的编译器版本是gcc/g++ 4.6.3,所以需要升级。可以利用...
  • C++中中静态变量在初始化

    千次阅读 2020-08-02 15:32:59
    我们知道C++的静态成员变量是需要初始化的,但为什么要初始化呢。 其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。 两者的区别在于:初始化...
  • C++类内成员初始化

    千次阅读 2017-12-03 12:14:33
    统统不建议在类内初始化,因为本质上只是声明,并不分配内存,而初始化会分配内存,类内初始化会将两个过程混在一起! 按顺序说。 首先静态成员,用static限制的成员: 在类内初始化静态成员,那么就必须...
  • python 中初始化方法

    千次阅读 2020-09-02 10:38:37
    在 Python 的中,有一种特殊的方法——初始化方法。它的格式是def__init__(self):,方法名由init(initialize 的缩写,初始化的意思)加左右两边的双下划线组成。 初始化方法的特殊之处是:每当进行的实例化时...
  • c++初始化原理

    千次阅读 2018-08-17 23:11:54
    一、初始化时带括号和不带括号的区别 class Test4 { public: Test3 t3; Test4(){ t3 = Test3(); cout &lt;&lt; "Test4" &lt;&lt; endl; } }; int main() { Test3 t3; cout &...
  • c++成员初始化方式

    万次阅读 多人点赞 2019-07-11 18:59:33
    转载自: ...常用的初始化可能如下: 1)赋值初始化 class Student { public: Student(string in_name, int in_age) { name = in_name; age = in_age; } private : string...
  • C++类内静态成员的初始化

    千次阅读 2017-11-18 16:16:08
    在C++中,的静态成员(static member)必须在类内声明,在初始化,像下面这样 class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 初始化,不必再加static关键字 为什么?...
  • //静态成员不能在类内初始化。 使用时:int tmp=A::si 的static member不会存在每一个具体的class object之中,而是存放在全局变量区,不论一个class有多少个具体实例,static data都只有一个。 ...
  • } 这里的错误在于,不能在class的定义里面初始化a。 来看下对的: #include using std::cout; //class class loopsaker { public: static int a;// 这里只是声明 loopsaker(); }; int loopsaker::a=1;//这里是定义 ...
  • c++成员变量初始化详解

    千次阅读 2022-04-15 10:08:24
    1.类初始化顺序 当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。 注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造...
  • c++的成员变量初始化总结

    千次阅读 2019-06-14 17:04:11
    1.c++变量的初始化方式 首先把需要初始化的成员变量分为几:...一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者初始化 b.静态成员变量必须在初始化 c.常量必须在初始化列表里初始...
  • 中vector的初始化问题

    千次阅读 多人点赞 2020-07-10 08:31:45
    今天分享一个在中使用 vector 并初始化的小 trick 。 事情的起因是这样的: 在做牛客网的在线编程题时,一个小伙伴问我:“为什么我这里会报错啊?” 题目: 请实现一个函数用来找出字符流中第一个只出现一次的...
  • C++中成员变量的初始化总结一

    千次阅读 2019-09-01 22:02:40
    考虑一下效率的可以再构造函数的初始化列表中进行。 class CA { public: int data; …… public: CA(); …… }; CA::CA():data(0)//……#1……初始化列表方式 { //data = 0;//……#1……赋值...
  • 的静态成员变量初始化问题

    千次阅读 2019-08-12 20:24:37
    我们都知道的静态成员变量必须在初始化,不仅如此,的静态成员变量最好在源文件中初始化,而不能在头文件初始化,否则,编译的时候就会报错"symbol multiply defined". 举例: /*--testA.h--*/ class A ...
  • C++中的静态变量初始化

    千次阅读 2020-05-02 22:56:38
    关于C++中的静态变量,或者说中结构体中的静态变量的初始化问题,解释如下: 1.首先,定义在结构体或者中的变量,在头文件中定义时仅仅是一个声明,并未分配空间,只有在静态变量被初始化之后才分配空间...
  • C++ 对象数组初始化

    万次阅读 多人点赞 2018-11-02 21:13:24
    如何给中定义了带有参数的构造函数的对象数组赋值 class A { public: A(){}//无参构造函数0 A(int i){}//有参构造函数1 A(int i,int j){}//有参构造函数2 }; int main() { A a,b[5];//调用6次无参构造函数...
  • C++学习——初始化

    千次阅读 2021-06-17 15:39:03
    通过构造函数进行数据成员初始化2.成员初始化方式?3.什么情况下必须使用列表初始化?4.为什么用列表初始化成员变量会快一些?5.派生构造函数的执行顺序 1.通过构造函数进行数据成员初始化 一般来说,中的...
  •  (C++11提供了类内初始化,因此内类常量可在声明时进行类内初始化,因此该类内常量的作用域属于级,即该的所有对象均具有同一个值。)#include &lt;iostream&gt; using namespace std; class A ...
  • C++中初始化

    千次阅读 2019-05-05 18:08:39
    这是《C++primer》的笔记和总结,在C++的中,用来初始化类中的成员的方式多种多样,常常是依据这些变量的特性来决定的,比如const、static以及引用等类型。这里说的是最普通的初始化方式,估计用的也最少,是继承...
  • python-初始化方法

    千次阅读 2022-03-18 12:47:58
    初始化方法 __init__方法是专门用来定义一个具有哪些属性的方法 当使用类名()创建对象时,会自动执行以下操作: 为对象在内存中分配空间—创建对象 为对象的属性设置初始值—自动调用初始化方法(init) ...
  • Qt构造函数的初始化问题

    千次阅读 2020-08-10 15:32:06
    在Qt新建继承Qt后,经常会在构造函数看到parent的参数的初始化。如: DialogRangeReference.h class DialogRangeReference : public QDialog { Q_OBJECT public: explicit DialogRangeReference(QWidget *p
  • 为什么静态成员不能在类内初始化 在C++中,的静态成员(static member)必须在类内声明,在初始化,像下面这样。 class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 外...
  • 初始化顺序详解

    千次阅读 2018-08-23 13:14:15
    先声明一个常识,域和局部变量初始化的差异如下, 局部变量不初始化会报错: 中属性(也称域)不赋初值,默认为0,如果是引用默认为空。 正题 一、中属性按照定义的顺序初始化 我们声明一个Child...
  • C++中的数组初始化

    千次阅读 2020-04-01 15:34:20
    数组初始化规则: 在定义数组时才能使用初始化,不能将一个数组赋值给另一个数组。 初始化数组时,数组元素个数已给定时,可以部分初始化,未给出的将被设置为0。 初始化数组时,若元素个数未定义,则以初始化给定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,563,582
精华内容 1,025,432
关键字:

类内初始化