1.const修饰类的成员函数
-
示例1:
-
示例2:
2.再谈构造函数
构造函数有两种初始化成员变量的方法:
1. 在创建对象时定义成员变量,在构造函数体内对成员变量赋
相当于 :
int a;
a = 1;
Date(int year = 2020, int month = 3, int day = 3)
{
//在构造函数体内对定义好的成员变量进行赋值
_year = year;
_month = month;
_day = day;
}
int main()
{
Date d; //创建对象时定义了成员变量
return 0;
}
2. 用初始化列表,定义成员变量的同时对其进行赋值
相当于 int a = 1;
Date(int year = 2020, int month = 3, int day = 3)
//在初始化列表定义成员变量的同时对其进行赋值
:_year(year)
,_month(month)
,_day(day)
{}
初始化列表的作用:
由初始化列表的特性可知,需要在定义同时赋值的变量就必须使用初始化列表对其初始化。
必须要在定义时初始化的变量有:
1.const修饰的变量
2.引用类型的变量
3.没有无参构造函数的自定义类型
注:初始化列表初始化成员变量的顺序与初始化列表中的排序无关,只与类中成员变量的声明顺序有关
3.static成员
用static修饰的类成员称为静态成员,静态成员变量需要在类外初始化。
- 静态成员变量
静态成员变量不属于某个对象,而属于类的所有对象,在静态区,初始化要在类外
求一个类创建了多少个对象,就要用到静态成员变量用来计数
class A
{
public:
A()
{
count++;
}
private:
static int count; //声明一个静态成员变量计数,因为他被所有对象共用
};
int A::count = 0; //在类外初始化静态成员变量
- 静态成员函数
class A
{
public:
A()
{
count++;
}
static int GetCountA() //形参没有this指针,因此函数中不能访问费静态成员
{
return count;
}
private:
static int count;
};
int A::count = 0; //在类外初始化静态成员变量
int main()
{
A a1;
cout << A::GetCountA() << endl;
return 0;
}
静态成员函数没有this指针,调用时不能用 对象.函数名() 调用,要用 A::函数名() 调用 。
静态成员函数中不能访问非静态成员函数或变量(没有this指针)
注:C++11中,非静态成员变量在声明时可以给缺省值,调用默认构造函数时就会用该缺省值对成员变量进行初始化,解决了默认构造函数对内置类型不做处理的问题。
4.匿名对象
顾名思义,匿名对象就是类创建出的没有名字的对象,特点:
- 匿名对象的生命周期只在定义的那一行。
class A
{
public:
A(int n=0)
:_n(n)
{}
private:
itnt _a;
};
int main()
{
A(1); //匿名对象,生命周期只在这一行
A a1();
return 0;
}
匿名对象的使用场景: