精华内容
下载资源
问答
  • 常成员函数初始化
    千次阅读
    2021-05-23 16:29:58

    构造函数初始化数据成员

    方法一:在构造函数体内进行数据成员的初始化

    如下:

    class Point {
    public:
        Point(int tx,int ty){
            x=tx;
            y=ty;
        }
    private:
        int x;
        int y;
    };

    构造函数也可以在类外定义:

    class Point
    {
    public:
        Point(int, int);
    
    private:
        int x;
        int y;
    };
    Point::Point(int tx, int ty)
    {
        x = tx;
        y = ty;
    }

     

    方法二:用参数初始化表对数据成员初始化

    这个方法显得构造函数的定义非常简洁。常用。

    class Point
    {
    public:
        Point(int tx, int ty) : x(tx), y(ty){}
    
    private:
        int x;
        int y;
    };

     

     

    更多相关内容
  • 2、C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。 【const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,...

    1、static定义的静态变量不属于某个具体类对象,它是属于类的的,只能在类的内部声明,在类外定义;即在C++中,static静态成员变量不能在类的内部初始化;

    2、C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

      【const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。】

    3、要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static conststatic cons变量就可以在声明时初始化。

    4、常成员函数:主要适用于不改变类中成员变量,只读取的。比如GetValue之类的函数。

    #pragma once
    
    #include <iostream>
    class CTestBasic
    {
    public:
    	//常成员:默认初始化
    	CTestBasic() :conNum(0) {
    		value = -1;
    		pValue = new int;
    	}
    	//常成员:重载初始化
    	CTestBasic(int num ) :conNum(num) {}
    
    
    	//常成员函数:又成为只读函数,不能改变成员变量的值
    	int getsNum() const;
    	int getcNum() const;
    	int get_scNum() const;
    	int getPointerValue() const;
    
    	~CTestBasic();
    private:
    	//const成员变量不能在类定义处初始化,[ 只能通过构造函数初始化列表进行 ],并且必须有构造函数
    	const int conNum;
    
    	//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象.
    	static int sNum;
    
    	
    	const static  int scNum = 100;
    	int value;
    	int* pValue;
    };
    #include "CTestBasic.h"
    
    //静态成员类外初始化
    int CTestBasic::sNum = 1;
    
    //函数定义也必须包含const 关键字
    int CTestBasic::getsNum() const
    {
    	return sNum;
    }
    
    int CTestBasic::getcNum() const
    {
    	return conNum;
    }
    
    int CTestBasic::get_scNum() const
    {
    	return scNum;
    }
    
    int CTestBasic::getPointerValue() const
    {
    	*pValue = 200;
    	//pValue++; Error: pValue的值不能改变
    	return *pValue;
    }
    
    CTestBasic::~CTestBasic()
    {
    }
    

    展开全文
  • C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
  • 成员函数初始化列表

    千次阅读 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老师的课程所得

    展开全文
  • c++类成员变量初始化详解

    千次阅读 2022-04-15 10:08:24
    注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。 2....

    1.类初始化顺序

    当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。

    注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。

    2.声明时初始化

    第一种方式是在成员变量声明时初始化。可以看如下示例。

    class D {
        int a = 10;
    };
    

    在声明变量a的时候即给其初始化为10。不过注意这种写法是c++11以后才有的。上述代码在IDE中会有如下警告信息:

    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]
    

    3.构造函数初始化列表

    第二种方式是在构造函数中加入一个初始化列表,对成员变量进行初始化。

    class D {
        int a, b;
        string c;
        public:
            D() : a(1), b(2), c("sss") {
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    

    如果我们对D进行实例化,

    int main(int argc, char const *argv[])
    {
        D d;
        return 0;
    }
    

    代码会有如下输出

    a is: 1
    b is: 2
    c is: sss
    

    4.构造函数内部赋值

    在其他语言中,比如java,最常用的方式为在构造函数内部赋值。

    class D {
        int a, b;
        string c;
        public:
            D(int a, int b, string c) {
                this->a = a;
                this->b = b;
                this->c = c;
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    
    int main(int argc, char const *argv[])
    {
        D d(1, 2, "sss");
        return 0;
    }
    

    上面代码输出为

    a is: 1
    b is: 2
    c is: sss
    

    5.只能构造函数初始化列表的情况

    如果一个类成员,他本身是一个类或者结构,而且这个类成员没有默认的无参构造函数,只有带参数的构造函数,这个时候对类成员初始化时,必须调用类成员带参数的构造函数。如果再初始化列表中没有完成类成员初始化,代码会报错。

    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上述代码是可以正常运行的,因为类E有默认无参构造函数。

    而如果将代码改为下面的样子,给E加一个带参数的构造函数

    class E {
        int num;
        public:
            E(int n) {
                this->num = n;
            }
    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上面代码在IDE里直接会报错:

    constructor for 'F' must explicitly initialize the member 'e' which does not have a default constructor
    

    此时需要将F的构造函数改成如下形式:

    class F {
        E e;
        public:
            F() : e(10) {cout<<"init F class!"<<endl;}
    };
    

    另外,如果类的成员变量中有const时候,也需要在成员初始化列表中赋值完成初始化。

    class F {
        private:
            const int num;
        public:
            F(): num(10) {}
    };
    

    比如上面类F中有一个const常量num,就需要再F构造函数列表中对其进行赋值,否则代码会报错。

    6.列表初始化与构造函数初始化区别

    当采用列表初始化的时候,代码直接调用了成员变量的构造函数,只需要一步就可以完成。
    而在构造函数中初始化的时候,先调用的是成员变量的默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
    当类的结构较为复杂的时候,会存在性能上的差异。

    展开全文
  • 在构造函数的参数中,通过参数初始化表来对成员变量进行初始化。这种方法不在函数体内对成员变量初始化,而是在函数首部实现。对于上面提到的student类定义,构造函数可以改用以下形式: 程序运行结果如下: ...
  • #include using namespace std; class Desk{ ... /*声明一个有参的构造函数,并用参数的初始化列表对数据成员初始化*/ Desk(int h,int w,int l):height(h),width(w),length(l){} int volume(); private:
  • c++11 : 以类内成员函数初始化线程

    千次阅读 2018-07-25 09:40:43
    因为 c++ 禁止获取不合格或括号内的非静态成员函数的地址 这是因为 只有在显示的使用&时,才会形成指向类成员的指针 ,并且后面的标识符是 不在括号中 的,即 &qualified-id 如果是 &(qualified-id) 是不能形成指向...
  • c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化 有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后...
  • 1.定义静态数据成员后要对静态数据成员进行初始化! 静态数据成员初始化: <数据类型><类名>::静态数据成员 = <值> 2.静态数据成员往往数私有的,静态数据成员不能直接访问,要通过定义为公有...
  • 函数初始化

    千次阅读 2019-06-12 23:34:14
    然后st成员变量初始化结束,执行下一个static。输出1. 继续初始化下一个static 变量b 最后调用magimaFunction 输出4. 在进行static MagimaTest st = new MagimaTest();时,下面的static不进行初始化,需要先将...
  • **************************数据成员初始化 *******************************************************************************************************************1、数据成员是否能在定义类的时候就初始化?...
  • 数据成员必须在构造函数初始化列表中初始化: 没有默认构造函数的内嵌对象引用类型的数据成员常数据成员
  • 本文最后更新于 2019年 5月 1号 晚上 8点 01分,并同步发布于 : ... 成员赋值初始化 — 微软技术文档 构造函数 — 微软技术文档 成员初始化语法 构造函数 那么这两种方式有什么区别 ? 我们先看一下反编译...
  • 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋值与计算。 使用初始化列表有两个原因:原因1.必须这样做: 《C++ Primer》中提到在以下三种情况下需要使用...
  • 第一行中单冒号及其后边的内容我完全不知道是什么意思,前所未见,闻所未闻,于是查阅相关资料并询问了群里边的相关大神,最后得到的答案是冒号后边是“初始化成员列表”,于是自己上网查阅相关内容,最终搞明白了这...
  • C++中默认构造函数和构造函数初始化列表

    千次阅读 多人点赞 2018-12-13 10:59:45
    1、默认构造函数和构造函数 (1)构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void))。 (2)默认构造函数:默认构造函数是在调用时不需要显示地传入实参...
  • 有一个类A,其数据成员如下: class A { ... private: int a; public: const int b;...则构造函数中,成员变量一定要通过初始化列表来初始化的是...构造函数中,成员变量一定要通过初始化列表来初始化的有以下几种...
  • C++静态成员变量初始化

    千次阅读 2021-06-17 10:35:00
    静态成员变量初始化 静态成员变量可以初始化,但只能在类体外进行初始化。... 注意:不可以在构造函数的参数初始化表中对静态成员变量初始化,例如: student(char* pn, char* pa, int n):number(n) ...
  • C++构造函数初始化

    千次阅读 2018-06-14 10:09:39
    构造函数后面增加冒号一般有三种作用(1)对成员变量的初始化(2)对类成员对象初始化(3)对父类进行初始化示例1-对成员变量的初始化#include &lt;stdlib.h&gt; #include &lt;iostream&gt; using ...
  • C++类构造函数初始化列表与父类

    千次阅读 2020-12-05 15:53:08
    一、C++类构造函数初始化列表 class CExample { public: int a; float b; //构造函数初始化列表 CExample() : a(0), b(8.8) {} //构造函数内部赋值 CExample() { a = 0; b = 8.8; } }; 上面的例子中...
  • 文章目录C++中重载构造函数的互相调用初始化成员变量的问题不能直接互相调用的重载构造函数使用一个private的函数初始化成员变量使用带有默认参数的构造函数使用placement new运算符调用重载构造函数使用C++11的委托...
  • 一,必须在构造函数初始化列表里进行初始化的数据成员有哪些? 下面是一个自定义的Student类 class Address{}; class Student{ private: const int grade; string &name; Address addr; public: Student(int ...
  • Qt构造函数初始化问题

    千次阅读 2020-08-10 15:32:06
    QT中用父类构造函数初始化子类的成员变量 Qt ------ 初始化构造函数参数,parent C++ 构造函数和析构函数是否可以继承? 描述 在Qt新建继承Qt类的类后,经常会在构造函数看到parent的参数的初始化。如: ...
  • 摘要:在C++11之后,声明时初始化->初始化列表->构造函数初始化
  • 定义一个类,类中有一个vector成员初始化的时候发现了一个问题理解不了 ![初始化报错](https://img-ask.csdn.net/upload/201707/02/1498983894_308029.png) 使用这种初始化方式报错 ![初始化报错]...
  • C++构造函数初始化列表

    千次阅读 2022-03-04 10:07:39
    C++构造函数初始化列表详解
  • c++构造函数成员变量的初始化

    千次阅读 2018-07-12 09:31:30
    写代码的时候才发现自己有多么菜,昨天应为构造函数变量初始化理解错误导致了未初始化的错误。 前因后果 看看我怎么定义的, typedef struct rb_node{ int key; int bhight; int color; struct rb_node* ...
  • 本文探讨C++构造函数体内初始化与列表初始化的区别: 结论是: 若某个类(下文的class B)有一个类成员是类类型(下文的class A),那么 1、若类B通过构造函数体内初始化,会先调用类A的默认构造函数(无参构造...
  • C++之数据成员初始化

    千次阅读 2019-05-16 13:24:33
    类数据成员初始化,这份工作主要是构造函数负责的,构造函数的职责之一就是对数据成员进行正确初始化。实际上,构造函数的执行过程主要有两个阶段: (1)初始化阶段 (2)普通计算阶段 初始化阶段是指对数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 557,254
精华内容 222,901
关键字:

常成员函数初始化