细节方面
1.构造函数方面
初始化列表
在构造函数处,以一个冒号开始,接着以逗号分隔数据成员列表,在每一个成员变量后面加上括号,在括号内部使用类似于拷贝构造的方式进行初始化成员变量。
class Date
{
public:
Date(int year = 2019, int month = 10, int day = 19)//构造函数
:_year(year)//初始化列表
,_month(month)
, _day(day)
{
}
Date(Date& d)//拷贝构造函数
:_year(d._year)//初始化列表
,_month(d._month)
,_day(d._day)
{
}
private:
int _year;
int _month;
int _day;
};
注意:
- 每个成员变量在初始化列表中只能初始化一次。
- 类中包含一下成员,必须放在初始化列表中进行初始化。
const修饰的成员变量
引用类型的成员变量
类类型(自定义类型)的成员变量(并且自定义类中没有默认的构造函数)
例子1
class B
{
public:
private:
int& _ref;
const int _b;
};
int main()
{
B b;
return 0;
}
直接实例化对象b时,报出了一个错误?
当B中存在成员变量const或者&类型时,直接报出错误。
例子2
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
private:
A _ca;
};
int main()
{
B b;
return 0;
}
同样也出现了报错:
当B类实例化对象b时,由于B中存在A类的对象,所以在实例化对象时,如果没有合适的构造函数供B中的_a对象调用,则也会出现这种类型的报错。
解决方法
利用列表初始化来将这三种在实例化对象时出现的无法正确实例化的进行解决。
const:不可修改的变量,所以在创建的时候一定要初始化;
&类型:引用类型必须在创建时,引用一个变量,否则没办法进行创建。
自定义类型:自定义类型如果没有合适可调用构造函数进行调用的化,自定义类型无法实例化对象。
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(A ca, int ref, int b)//使用初始化列表
:_ca(ca)
,_ref(ref)
,_b(b)
{}
private:
A _ca;
int& _ref;
const int _b;
};
int main()
{
B b(1, 2, 3);//传递列表中的参数
return 0;
}
先将自定义类中的_ca进行构造完成,在调用初始化列表将const,int& 一同初始化。
注意
- 尽量使用初始化列表进行初始化,因为在自定义类型的成员变量中,会使用初始化列表进行初始化。
- 成员变量在类中的声明次序就是其在初始化列表中的初始化次序,于其在初始化列表中的顺序无关。
class B
{
public:
B(int a, int b)
: _b(b)//先初始化成员变量_a
, _a(a)//与所放置位置无关
{
}
private:
int _a;
int _b;
};
构造无名对象
当实例化一个对象时,该对象只有一个参数,可以直接用=符号进行赋值。
class B
{
public:
B(int a) :_a(a)
{
}
private:
int _a;
};
int main()
{
B b1(1);
b1 = 20;
return 0;
}
在b1(1);时,b1中成员变量_a首先变为1;
虽有b1 = 20;直接将20构造成一个无名的B类型对象,从而进行对b1的赋值语句。
2.静态成员
静态成员变量
- 静态成员变量在初始化时,不可以放在列表初始化的位置。必须在类外进行初始化。
- 静态成员变量可以认为是类外的一个成员变量,所有对象共享该静态成员变量。
class B
{
public:
B()
{
}
private:
static int _s;
};
int B::_s = 10;// 在类外进行初始化静态成员变量
int main()
{
B b;
return 0;
}
静态成员函数
- 静态成员函数在类内进行声明,可以在类外进行实现,也可以在类内进行实现。
class B
{
public:
static void Func1();
static void Func2()
{
cout<<"static Func2"<<endl;
}
private:
int _a;
};
void B::Fun1c1()//在类外实现也和静态成员变量相同,
{ //必须的加上作用域限定符B
cout << "static Func1" << endl;
}
int main()
{
B b;
b.Func1();
b.Func2();
}
- 静态成员函数中不包含this指针
class B
{
public:
static void Func()
{
_a = 10;//在类内静态成员函数调用this指针中的变量_a
}
private:
int _a;
};
int main()
{
B b;
b.Func();
}