首页 > 其他分享 >类成员初始化的两种方法,const,static类成员的初始化

类成员初始化的两种方法,const,static类成员的初始化

时间:2023-04-12 22:45:26浏览次数:45  
标签:初始化 const name 成员 Entity 构造函数

类成员初始化的两种方法,const,static类成员的初始化

我们已经知道可以用构造函数里的代码来初始化对象,这就是我们要用的第一种初始化方式

第一种初始化方式

#include<bits/stdc++.h>
using namespace std;
class Entity {
private:
	string m_name;
public:
	Entity() {
		m_name = "Unknown";
	}
	Entity(const string &name) {
		m_name = name;


	}
	string Get_name() const {
		return m_name;

	}
};
int main()
{
	Entity e0;
	cout << e0.Get_name() << endl;
	Entity e1("xiao ming");
	cout << e1.Get_name() << endl;
}

可以发现代码里的构造函数里规定了m_named的值,但如果变量变多,并且要在构造函数里添加函数的话。第一种未免有点繁琐了(对于观看者来讲)像:

Entity() {
    a=0;
    b=0;
	m_name = "Unknown";
    Init();
    Display();
	}

这样在构造函数里面既有函数,又要初始化,会显得杂乱,另外还有一个严重的问题,后面会讲到。

所以出现了第二种初始化方式

第二种初始化方式

	Entity() :m_name("Unknown") {
	}
	Entity(const string &name):m_name(name) {
	}

这种构造函数后面加冒号的行为来进行初始化,有下面个好处

  1. 代码整洁自然不用说

  2. 节约内存空间,防止多次构造函数。

    为什么这么说,直接看代码!

    #include<bits/stdc++.h>
    using namespace std;
    class Example {
    private:
    public:
    	Example() {
    		std::cout << "Created Entity!" << endl;
    
    	}
    	Example(int x) {
    		std::cout << "Created Entity with " << x <<"!"<< endl;
    
    	}
    
    
    };
    class Entity {
    private:
    	string m_name;
    	Example m_example;
    public:
    	Entity(){
    		m_name = std::string("Unknown");
    		m_example=Example(8);
    	}//重点看这里
    	Entity(const string &name):m_name(name) {
    	}
    	string Get_name() const {
    		return m_name;
    
    	}
    };
    int main()
    {
    	Entity e0;
    	cout << e0.Get_name() << endl;
    	
    }
    

结果为:

Created Entity!
Created Entity with 8!
Unknown

看出蹊跷了,他在我们不知道的情况下多生成了默认构造函数,这并不是我们想要的。

这是因为,我们多创立了一个空间来容纳对example的二次初始化。

我们的目的是扔掉它,用一个新的对象覆它,我们创建了两个对象,而不是一个

这时应该这样

Entity():m_example(Example(8)) {
		m_name = std::string("Unknown");
		
	}

或者

Entity():m_example(8) {
		m_name = std::string("Unknown");
		
	}

此时的结果为:

Created Entity with 8!
Unknown

另外冒号标识符非常重要的作用有下面:

以下参考[类的常量成员的初始化]((7条消息) 类的常量成员的初始化_类中常量成员初始化_chengonghao的博客-CSDN博客)

类的成员的初始化:

  1. 非static非const成员变量,必须在构造函数中进行初始化;

  2. static成员变量,必须在类的外面进行初始化;

  3. const成员变量,必须在类的构造函数的初始化列表中初始化;

  4. static const成员变量,可以在类的内部声明时初始化。

    class A
    {
       const int Size = 0;
    }
    

    这里会报错,常量成员不能在类中声明的地方初始化,因为此时类并没有进行实例化(创建对象),因此并没有分配内存,不能进行初始化。

上述示例应该写成:

class A
{
public:
   const int Size;
   A() : Size(0){}
}

类常量成员初始化

#include<iostream>
class Circle {
public:
	 const double rad;
	 
	Circle(const double w_rad) :rad(w_rad){}

嗯,以上就是全部喽

标签:初始化,const,name,成员,Entity,构造函数
From: https://www.cnblogs.com/drip3775/p/17311608.html

相关文章

  • c#中byte数组0x_(C#基础) byte[] 之初始化, 赋值,转换。
    c#中byte数组0x_(C#基础)byte[]之初始化,赋值,转换。原文链接:https://blog.csdn.net/weixin_39862716/article/details/111506430byte[]之初始化赋值用forloop赋值当然是最基本的方法,不过在C#里面还有其他的便捷方法。1.创建一个长度为10的byte数组,并且其中每个byte的......
  • 在C#中使用Attributes(特性)来控制枚举成员是否应该被序列化或映射
    如果标记了[NonSerialized]特性,会防止将该字段序列化。但是,该字段仍然可以用于foreach迭代,因为它仍然是枚举的有效成员。如果要防止特定枚举成员被foreach迭代,用[NonSerialized]特性是不起作用的。相反,可以创建一个自定义的Attribute继承自System.Attribute,并将其应用到需要隐藏的......
  • memset初始化类对象出错解析
    void*memset(void*s,intv,size_tn); 英文释义如下:Copiesthevaluev(convertedtotypeunsignedchar)tothefirstnbytespointedtobys;returnss. 这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);使用memset......
  • 定义一个基类Base,有两个公有成员函数fn1,fn2,私有派生出Derived类,如何通过Derived类
    定义一个基类Base,有两个公有成员函数fn1,fn2,私有派生出Derived类,如何通过Derived类的对象调用基类的函数fn1。#include<bits/stdc++.h>usingnamespacestd;classBase{public: intfn1(){return0;} intfn2(){return0;}};classDerived:privateBase{publi......
  • 定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员hei
    定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classObject{protected: doubleweight;public: Object(......
  • 'T' must be a non-abstract type with a public parameterless constructor
    虽然工作10多年,但是真正使用框架的项目很少很少...所以对接口,方法等约束毫无经验今天做了个动态代理dispatchproxy的类,但是在调用时却一直提示如下错误: ErrorCS0310'T'mustbeanon-abstracttypewithapublicparameterlessconstructorinordertouseitas......
  • 用find_if查找vector内对象的成员
    用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如vector<string>strVec;find(strVec.begin(),strVec.end(),”aa”);假如vector包含一个复合类型的对象呢比如classA{public:A(conststd::stringstr,intid){this->str=str;this->id=id;}private:......
  • 成员指针
    成员指针是C++中用于对类中成员进行操作。成员指针的定义格式:成员类型类名::*指针名=&类名::成员名;例:classA{intm;public:...};定义成员指针:intA::*p=&A::m;成员指针和普通指针区别:普通指针用确定对象的地址进行初......
  • c++ constexpr
    c++中,constexpr 让用户显式的声明函数或对象构造函数在编译期会成为常量表达式,这个关键字明确的告诉编译器应该去验证被声明的表达式在编译期就应该是一个常量表达式。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:constexprintmf=20;//20是常量......
  • C++逆向分析——类成员的访问控制
    类成员的访问控制课外→好的编程习惯:定义与实现分开写,提升代码可读性。如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么?structStudent{intage;intsex; voidPrint1(){printf("FuncPrint1");} voidPrint......