类Class
MFC采用了所有类名前以C作为前缀的约定。
- 类是用户定义的数据类型。
- 类的实例称为对象。
- 对象在定义中隐式地包含数据和操作数据的函数,这种思想称为封装。
类的数据项称为数据成员,函数的类成员称为函数成员或成员函数。
定义类
class class_name
{
public:
//data member
//function member
private:
//data member
//function member
protected:
//data member
//function member
}
类的访问控制
public | 公共,公开的。结构的默认值是public。 |
private | 私有的,只有类的内部成员可以访问。类成员默认是private。 |
protected | 受保护的,只有类的内部成员和继承类的成员可以访问。 |
声明类的对象
class_name variable_name;
#include <iostream>
#include <iomanip>
#include <string>
class CPerson
{
public:
std::string name;
int age;
};
int main()
{
CPerson person1;
CPerson person2;
}
访问类的数据成员
成员访问操作符.
person1.name = "Jeff";
person1.age= 20 ;
对象成员的初始化
数据成员是public,在创建对象时,可以在初始化列表中指定它们的值。如果在列表中提供少于数据成员的个数,未获取值得成员就设置为0。
CPerson person1{"Jeff",20};
std::cout << person1.name;
也可以提供一个空列表,把所有成员都初始化为0。
CPerson person1{};
初始化类的成员
可以在类类型的定义中指定数据成员的初始值,使用初始化列表。不必初始化每个数据成员。
class CPerson
{
public:
std::string name {"Jeff"};
int age {20};
};
类的成员函数
类的成员函数是其定义或其原型在类定义内部的函数。
class CPerson
{
public:
std::string name{ "Jeff" };
int age{ 20 };
void show()
{
std::cout << name << "'age is " << age << std::endl;
}
};
int main()
{
CPerson person1;
person1.show();
}
在类的外部定义成员函数
在类的外部定义成员函数,需要将函数原型放在类的内部。
在类的外部定义成员函数,给函数名加上类名作为前缀,并用作用域解析运算符::将二者分开。
class_name::function_name
class CPerson
{
public:
std::string name{ "Jeff" };
int age{ 20 };
void show();
};
int main()
{
CPerson person1;
person1.show();
}
inline void CPerson::show()//class_name::function_name
{
std::cout << name << "'age is " << age << std::endl;
}
内联函数
在内联函数中,编译器设法以函数体代码代替函数调用。这样可以避免调用函数时的大量系统开销,加速代码运行。
编译器将确保展开内联函数时不引起任何与变量名冲突或作用域有关的问题。
把函数指定为内联,并不能确保函数是内联的,编译器总不能插入内联函数的代码。
内联函数最适合于哪些非常短的简单函数。
在函数头前面加inline告诉编译器将函数视为内联函数。编译器不能将函数编译成内联函数时,代码仍然能运行编译。
可以把成员函数的定义放在类的外部,且让然保留内联函数在执行性能方面的优势。
inline void CPerson::show()
{
std::cout << name << "'age is " << age << std::endl;
}
inline关键字不是必须的,没有标记时编译器有时也可以内联处理。