hello,各位读者大大们你们好呀
系列专栏:【C++的学习】
本篇内容:再谈构造函数;static成员;匿名对象
⬆⬆⬆⬆上一篇:类和对象(中)(二)
作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员”后面跟一个放在括号中的初始值或表达式。
注意:
①每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
②类中包含以下成员,必须放在初始化列表位置进行初始化:
引用变量
const成员变量
自定义类型成员(且该类没有默认构造函数时)
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Time
{
public:
Time(int a)
:_hour(0),
_minute(0),
_second(0)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year=0,int month=0,int day=0)
:_year(year),
_month(month),
_day(day),
{}
private:
int _year;
int _month;
int _day;
Time _t;
};
int main()
{
return 0;
}
大家可以试一下,会报错的,因为这个类没有默认构造函数,我们必须在初始化列表来亲自初始化它才行
③尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化
其实本质上哪个对象调用构造函数,初始化列表是它所有成员变量定义的位置
不管是否显示在初始化列表写,编译器对于每个变量都会初始化列表处定义初始化
如果成员变量有缺省值,在初始化时没有显式初始化则使用缺省值,反之则使用自己设定的初始值
④成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后顺序无关
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Time
{
public:
Time(int a=1)
:_hour(0),
_minute(0),
_second(0)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 0, int month = 0, int day = 0)
:
_day(_year),
_year(year),
_month(month)
{}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date dl;
return 0;
}
大家可以去试一下
构造函数不仅可以构造于初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换作用
它其实本质上就是当中产生了一个临时的匿名对象,把1作为参数构造临时的匿名对象,然后临时的匿名对象再拷贝构造给d1,但是编译器会进行优化,把构造+拷贝优化成直接构造
在C++11中允许多个参数形成隐式类型转换
如果想要禁止构造函数的隐式转换,用explicit修饰构造函数
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
class Date
{
public:
Date(int year=1, int month=1, int day=1)
:
_day(day),
_year(year),
_month(month)
{}
static int Print()//静态成员函数
{
return count;
}
private:
static int count;//静态成员变量
int _year;
int _month;
int _day;
};
int Date::count = 0;//在类外初始化
①静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
②静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
③类静态成员即可用类名::静态成员或者对象.静态成员来访问
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Date
{
public:
Date(int year=1, int month=1, int day=1)
:
_day(day),
_year(year),
_month(month)
{}
//private:
static int count;//静态成员变量
int _year;
int _month;
int _day;
};
int Date::count = 0;//在类外初始化
int main()
{
//前提是成员用的是public访问限定符
Date d;
cout << Date::count << endl;
cout << d.count << endl;
Date* p = NULL;
cout << p->count<< endl;
//因为单纯就是访问类内部的count静态成员变量,而count也不是某个对象所属的,
//是所有类对象共享的,他存在静态区,所以说不需要解引用,直接去静态区找
cout << sizeof(Date) << endl;
return 0;
}
④静态成员函数没有隐藏的this指针,不能访问任何非静态成员
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Date
{
public:
Date(int year=1, int month=1, int day=1)
:
_day(day),
_year(year),
_month(month)
{}
static void Print()//静态成员函数
{
//_year=0;
count++;
cout << count << endl;
}
//private:
static int count;//静态成员变量
int _year;
int _month;
int _day;
};
int Date::count = 0;//在类外初始化
int main()
{
Date d;
d.Print();
return 0;
}
⑤静态成员也是类的成员,受public、protected、private访问限定符的限制
他的特点就是不用取名字,但是他的生命周期只有这一行,并且它具有常属性
可以看到它在使用完后就调用了析构函数
类和对象(下)(一)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!