【C++】——类的对象(下)

2024-07-21 1198阅读

文章目录

  • 再探构造函数
  • Static成员
  • 友元
  • 内部类
  • 匿名对象

    再探构造函数

    初始化列表

    以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式。

    class Date
    {
    public:
    	Date(int year, int month, int day)
    		: _year(year)
    		, _month(month)
    		,_day(day) 
    		//, _year(1)只能初始化一次
    	{}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    

    每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。

    我们需要注意,引用和const成员必须在初始化列表初始化

    class Date
    {
    public:
    	Date(int& ra,int year, int month, int day)
    		: _year(year)
    		, _month(month)
    		, _day(day)
    		//, _year(1)只能初始化一次
    		, _x(1)
    		, _a(ra)
    	{}
    private:
    	int _year;
    	int _month;
    	int _day;
    	const int _x;
    	int& _a;
    };
    

    没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。

    class sg
    {
    public:
    	/*sg(int mn = 0)
    		: _mn(mn)
    	{}*/
    private:
    	int _mn;
    };
    class Date
    {
    public:
    	Date(int& ra,int year, int month, int day)
    		: _year(year)
    		, _month(month)
    		, _day(day)
    		//, _year(1)只能初始化一次
    		, _x(1)
    		, _a(ra)
    		, _mn(1)
    	{}
    private:
    	int _year;
    	int _month;
    	int _day;
    	const int _x;
    	int& _a;
    	sg _mn;
    };
    
    private:
    	//声明处定义等同于缺省值
    	int _year = 1;
    	int _month = 1;
    	int _day = 1;
    

    总结:以后尽量用初始化列表初始化。

    因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。

    初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。

    class A
    {
    public:
    	A(int a)
    		: _a1(a)
    		, _a2(_a1)
    	{}
    	void Print() 
    	{
    		cout 
    	A aa(1);
    	aa.Print();
    	return 0;
    }
    
    	static int Get_a()
    	{
    		//a++;---静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
    	}
    	void func()
    	{
    		//非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
    		cout 
    	// 友元声明
    	friend class b;
    private:
    	int _a1 = 1;
    	int _a2 = 2;
    };
    class b
    {
    public:
    	void func1(const a& aa)
    	{
    		cout 
    		cout 
    	return 0;
    }
    
    public:
    	A(int a = 0)
    		:_a(a)
    	{
    		cout 
    		cout 
    public:
    	int Sum_Solution(int n) {
    		//...
    		return n;
    	}
    };
    int main()
    {
    	A aa1;  //有名对象
    	// 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义
    	//A aa2();
    	// 生命周期只在当前一行
    	A(); // 匿名对象
    	A(1);
    	Solution st;
    	cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]