- 前言
- 成员初始化列表
- 类内初始化
- 静态成员
- 静态数据成员
- 静态成员函数
- 静态成员总结
- 嵌套结构
本篇类的进阶学习包括,成员列表初始化,类内初始化,静态成员,嵌套结构。
成员初始化列表之前的构造函数,是在函数内部代码块中初始化成员。
那么就会出现const成员,引用成员的初始化问题,对于下面这个类声明:
class A{
private:
int a_;
double b_;
const float c_;
long& d_;
public:
A(int, double, float, long&);
};
如果还是在构造函数的代码块中初始化成员:
A::A(int a, double b, float c, long& d){
a_ = a;
b_ = b;
c_ = c;
d_ = d;
}
将报rror: assignment of read-only member 'A::c_' c_ = c;
和error: uninitialized reference member in 'long int&'
,原因是const
常量和引用变量必须在创建的同时初始化。
初始化成员列表能够在创建成员进行初始化,语法为: 类名::构造函数名(参数列表): 成员(参数), 成员(参数) {}
示例如下:
A::A(int a, double b, float c, long& d):
a_(a), b_(b), c_(c), d_(d) {}
也可以把部分成员放在代码块内,部分放在成员初始化列表中:
A::A(int a, double b, float c, long& d): c_(c), d_(d) {
a_ = a;
b_ = b;
}
成员初始化列表在对象创建时,初始化成员。
注意:成员初始化列表只能用于构造函数。当类声明中出现非静态const成员或者引用成员,必须使用成员初始化列表。
类内初始化在创建对象时,系统才会为成员开辟内存。因此,在类声明中不能为成员提供初始值。
但C++11新特性允许在类声明中为成员提供默认初始值:
class A{
private:
int a_ = 0;
double b_ = 0.;
const float c_ = 0.f;
long& d_;
public:
A(int, double, float, long&);
};
C++11的类内初始化,等价于在构造函数中使用成员初始化列表。为成员分配内存仍然是在创建对象时完成的。
如果创建对象的构造函数时也使用了成员初始化列表,则构造函数中的成员初始化列表值将覆盖类内初始化的默认值。
静态成员类中带static
关键字的成员就是静态成员。
静态成员包括静态数据成员,静态成员函数。
静态数据成员与其它静态变量放在一起,程序运行时即被创建,由所有该类对象共享。如果访问权限公有,则可以直接在程序中访问。
静态成员函数没有this指针,因此不能调用对象的非静态成员,也不能使用非静态成员函数。
静态成员示例如下:
//declare_class.h
class A{
private:
int a_ = 0;
double b_ = 0.;
const float c_ = 0.;
long& d_;
// static int e_ = 1; // error!
static const int e_ = 1;
public:
static int num;
A(long&);
void printA();
static void printNum();
};
//define_class.cpp
#include "declare_class.h"
int A::num = 0;
A::A(long& d): d_(d)
{
num++;
}
void A::printA(){
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?