c++类和对象(初始化列表、explicit、static修饰成员、友元、内部类)

1.初始化列表

1.来源

c++类中的构造函数,可以在实例化对象时初始化对象的成员变量的值,实际上它的初始化过程是在对象定义出来后,再进行的赋值。就类似于这样

int i; 
i = 1; 

而初始化列表是这样的效果

int i = 1;

显然初始化列表才能真正意义上称之为初始化。

2.概念

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

    class Date      
    {
    
          
      
    public:      
        Date(int year, int month, int day)
        //初始化列表      
        :_year(year)       
        ,_month(month)       
        ,_day(day)      
        {
    
    }       
      
    private:      
        int _year;      
        int _month;                                                                                                          
        int _day;    
    }; 

3.为什么要有初始化列表

c++中有些变量在定义是必须要初始化:
1.引用型
2.const修饰的
这些成员变量必须使用初始化列表。
不带默认构造函数自定义类型最好使用初始化列表。
在这里插入图片描述

2.explicit作用

禁止单参数的构造函数隐式转换.

3.static关键字

1.static修饰成员变量

用static修饰的成员变量,该变量定义在静态区,为所有类对象共享。但需要在类外定义和初始化。
在这里插入图片描述
访问该变量时需要用类名+域作用限定符来访问或对象+.来访问

Date::_a;

Date d1(2000, 1, 1, 0, 0, 0);
d1._a;

2.static修饰成员函数

静态成员函数没有隐含的this指针,不能访问类的非静态成员。

4.友元

可以在类一中声明类二或另一个函数为友元。作用:该类二和函数可以访问类一的私有成员。

class B
{
    
    
public:
	B()
	{
    
    
	}
private:
	int _b;
}
int GetA(const Date& d)
{
    
    
	return d._a;
}
class A
{
    
    
	friend int GetA(const Date& d); //声明为友元函数。
	friend class
public:
	A()
	{
    
    
	
	}
private:
	int _a;
}

5.内部类

类B声明在类A的内部。此时B是A的友元,B可以访问A的任意成员。但是A不是B的友元。

class A
{
    
    
public:
	A()
	{
    
    

	}
	class B
	{
    
    
	public:
		B()
		{
    
    
			A a;
			cout << a._a << endl;
		}
	};
private:
	int _a;
};

特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/114645023