一、头文件
头文件一般有两种形式:声明与标准库
C++ 标准库是 C++ 语言规范中定义的一个强大、丰富、可扩展的库集合。它不是一个单一的库,而是一个包含了容器、算法、函数对象、迭代器、字符串、输入/输出流、智能指针等众多组件的综合体。
声明则是将一个名称(变量名、函数名、类型名等)引入到程序的作用域中,并告知编译器该名称的存在及其类型信息。
#include<iostream>//标准库
#include"complex.h"//声明
二、类的声明
#ifndef COMPLEX // 头文件保护,防止重复包含
#define COMPLEX // 定义标识符
template<typename T> // 模板声明,T 是类型参数
class complex {
private:
T re, im; // 私有成员变量,分别表示实部和虚部
// 声明友元函数
friend complex& __doapl(complex*, const ccomplex&);
public:
// 构造函数,带有默认参数
// 其中的: re( r ), im( i )为初始化列表
complex(T r = 0, T i = 0) : re(r), im(i) {}
// 复合赋值运算符重载
complex& operator += (const complex&);
// 获取实部和虚部的成员函数(const 成员函数)
T real() const { return re; }
T imag() const { return im; }
};
#endif // 结束头文件保护
-
函数调用
将返回地址、寄存器状态等压入栈
为函数内的局部变量分配栈空间
传递参数
跳转到函数代码的地址
执行函数体
将返回值存入指定位置
弹出栈,恢复现场
跳转回调用处 -
内联函数(inline)
内联函数是 C++ 中一项用于提升程序运行效率的特性。它的核心思想是:在编译时,将函数调用处直接用函数体中的代码进行替换,从而消除函数调用的开销。
而且inline或者隐式内联(在类定义内部直接实现的成员函数)只是一个对编译器的建议,编译器有权决定是否真正进行内联。
内联函数通常用于小而简单、被频繁调用的函数。 -
构造函数
这个构造函数使用了成员初始化列表,来初始化成员变量re和im。
对于非内置类型,如果使用赋值方式在构造函数体内初始化,实际上会先调用默认构造函数,然后再进行赋值操作。而使用初始化列表则直接调用拷贝构造函数一次完成初始化,避免了额外的默认构造和赋值操作。 -
常量成员函数(const)
在一个成员函数的参数列表后加上 const 关键字,表示这个成员函数不会修改类的任何非静态成员变量。
mutable 用来突破 const 的限制。被 mutable 修饰的成员变量,即使在 const 成员函数中,也可以被修改。 -
参数传递
传递引用的好处:修改外部变量(替代指针)、避免复制开销(提高效率)
如果我们只想避免复制开销,但又不想让函数修改原始数据,就需要使用 const 引用。
指针可以随时改变其指向的对象,但是引用在初始化后就不能再改变其绑定的对象。所有对引用的操作都是在操作它最初绑定的那个对象。 -
返回值(Return by Value)
1.返回的是对象的副本
2.安全,调用者拥有返回值的完全所有权
3.可能产生复制开销(对于大型对象)
4.适用于返回基本数据类型和小型对象 -
返回指针
1.返回的是内存地址,而不是数据本身
2.避免了大型对象的复制开销
3.调用者需要关注指针的有效性(可能为空)
4.需要明确内存所有权(谁负责释放内存) -
返回引用
1.返回的是对象的别名,而不是副本
2.避免了复制开销
3.调用者可以修改原始对象(除非是const引用)
4.必须确保返回的引用指向的对象在函数返回后仍然存在 -
友元函数
友元函数是 C++ 中一个重要的特性,它允许非成员函数访问类的私有和保护成员。
注意:友元函数不是类的成员函数,它只是在类中声明为"朋友",定义仍在类外部。
友元函数的特性
1.不是成员函数:定义时不使用类名和作用域解析运算符
2.可以访问所有成员:包括 private 和 protected
3.不受访问限定符影响:可以在类的任何部分声明(public、private、protected)
4.没有 this 指针:因为是普通函数,不是成员函数
注意:相同的class的各个objects互为友元。 -
成员函数
1.属于类:成员函数是类的一部分,必须通过类的对象(或指针/引用)调用
2.访问权限:可以访问类的所有成员(包括私有和保护成员)
3.隐含的this指针:每个成员函数都有一个隐含的this指针,指向调用该函数的对象
4.作用域:在类的作用域内定义