本文转载自:VC驿站
https://www.cctry.com/thread-289700-1-1.html
1、类的普通成员函数:
类的普通成员函数跟普通的函数没什么太大的区别,也都是有参数的类型和形参,还有返回值之类的,唯一的区别就是必须由该类的实例化对象去调用。
这里面为什么强调是类的普通成员函数呢,难道还有不普通的吗?当然有,那就是类的静态成员函数,这个以后再做讲解!
2、inline 内联函数:
之前给大家讲解过普通的全局函数,刚刚又给大家讲解了类的成员函数,这里面又出来个inline内联函数是个什么东西呢?给大家讲解一下!
实际上inline内联函数是从C语言的宏发展而来的。例如,程序main函数中直接执行以下三行代码:
int a = 5;
++a;
int b = a + 3;
和将该三行代码封装成一个函数让main函数调用的开销是完全不一样的。函数调用的过程中需要将参数压栈等等操作,详情可以看下这篇帖子:
https://www.cctry.com/thread-289482-1-1.html
C语言中可以用宏来实现一些相对简单的函数,例如:
#define MAX_NUM(x, y) (x > y ? x : y)
调用的时候代码可以这样写:
int ret = MAX_NUM(3, 6);
调用的时候感觉 MAX_NUM 像个函数,但是他是个宏,宏跟函数的区别是,在编译阶段就将宏的代码展开直接替换调用宏的地方。所以省去了函数调用的压栈、出栈等开销。所以执行效率方面要比函数高。
但是宏定义写起来比较难度倒是不大,就是麻烦一些,而且代码的可阅读性会变差。所以C++中引入了inline内联函数这么个东西,用inline关键字声明的函数,可以在调用的时候,将函数的代码直接嵌入到调用的地方,所以大大的减少了函数调用的开销,提高了效率。
例如:
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
inline int max_num(int x, int y)
{
return x > y ? x : y;
}
public:
int get_max_num(int a, int b, int c)
{
int max_ab = max_num(a, b);
return max_ab > c ? max_ab : c;
}
void print_name()
{
cout << "name = " << name << endl;
}
};
备注1:默认情况下,在类体中直接定义/实现的函数,C++会自动的将其作为inline内联函数来处理,所以类似上面的代码:max_num、get_max_num、print_name 函数都会被看成是 inline 内联函数。而在类体外部定义的函数C++则会将其作为普通的类的成员函数来处理。那么如何在类体外部定义成员函数呢,接着往下看!
备注2:也不是把所有的函数都声明成 inline 就是好事儿,如果函数的执行体很大,很耗时,那么就不适合作为 inline 内联函数,只有当函数的执行体很小,只有几行代码,而且会被频繁的调用的时候才适合作为 inline 内联函数的。这点还请大家谨记。
3、类的声明和实现分离:
一般情况下,可以把类的声明和实现都写在一起,例如:
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
int max_num(int x, int y)
{
return x > y ? x : y;
}
public:
int get_max_num(int a, int b, int c)
{
int max_ab = max_num(a, b);
return max_ab > c ? max_ab : c;
}
void print_name()
{
cout << "name = " << name << endl;
}
};
但是,随着类的功能越来越多,类中的成员变量和成员函数也是越来越多,类的代码长度就越来越大,而且随着长度的增加不太便于阅读,层次不清晰,让人一眼望过去就一大面。那怎么办呢?
好的做法就是将类的声明和成员函数的定义分离开,成员函数的声明放在类的内部,实现或者定义放在类的外部,加上作用域限定一下就行,类似下面这样:
//类的声明
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
int max_num(int x, int y);
public:
int get_max_num(int a, int b, int c);
void print_name();
};
//类的成员函数的实现
int Student::max_num(int x, int y)
{
return x > y ? x : y;
}
int Student::get_max_num(int a, int b, int c)
{
int max_ab = max_num(a, b);
return max_ab > c ? max_ab : c;
}
void Student::print_name()
{
cout << "name = " << name << endl;
}
大家看到了吧,成员函数的实现已经拿出来了,这样类的声明就很短小精悍了,调理也比较清晰,易于阅读。
备注:注意类的作用域修饰:Student:: 这个不能丢,丢了就错了。
4、使用多文件分离类的声明和实现:
通过上面的学习,我们已经成功的将类的声明与实现分离了,但是呢,代码还是在一个文件中,不够清晰。接下来给大家介绍一种更贴近我们平时编程开发的方法:将类的声明放到 .h 头文件中,将类的实现放到 .cpp 实现文件中,谁要使用这个类,就 include 包含 .h 类的头文件就可以啦!接下来视频演示一下如何进行 h 和 cpp 的分离,具体看视频教程演示。
(模板类的代码必须都放在 .h 文件中,没办法实现 .h 和 .cpp 的分离,这个以后会讲解的)
这里面也可以直接使用VS2013添加类向导的方式来添加类到我们的工程中。起好类的名字之后,VS2013会自动添加该类的 h 头文件和 cpp 文件到我们的工程中,具体看教程演示!
所以,大家以后从一些开源网站,或者从咱们VC驿站下载的一些开源的类来使用的时候,作者都是提供关于该类的一个 .h 文件和一个 .cpp 文件。
备注:可以使用 Visual Assist X 小助手,快速的实现添加类的成员函数的实现,具体见视频教程演示!
5、小作业:
大家自己课后用VS2013练习如何添加类吧,多敲代码,多实践,不然你永远都记不住!
第31课视频教程下载地址: