1.h头文件的写法
C++代码包含头文件时,有些头文件是以.h结尾,比如
#include <iostream> // 命名空间
在早期c++可能会写成
#include <iostream.h>
.h文件是c和c++混合编程,c++向前兼容c的表现
再比如:
#include <stdio.h>
表示我要用标准c的库
#include <cstdio>
遵循命名空间,就是希望能够发挥c++运行时的作用,避免c的直接函数调用,使得c++的若干机制无法发挥作用,比如直接调用c语言的exit(), c++的析构函数就会无法起作用。
2.防卫性编程
防止重复包含头文件
#ifndef __XXX_H__
#define __XXX_H__
//content
#endif
或者
#pragma once // 如果编译器支持的话
3.不需要自定义析构函数的一种情况
class without pointer member ,若类内没有指针成员,则对象内所有数据存于栈空间,没有使用堆,通常不需要自定义析构函数,编译器会自动完成析构,释放该对象对栈空间的使用
4.类定义中的内联函数
成员函数如果定义在类的body中,该函数就是inline的候选函数
如果函数很短,就会成为inline
如果函数很长,则不会
5.const限定成员函数的意义
因为函数重载的存在,会使得误用无法避免,
const表示在这个方法内部不能改变这个对象的成员变量,编译器会提供相应的检查机制,以避免调用者误用
6.使用构造函数初始化列表的好处
使用初始化列表时,编译器直接用传入的参数初始化成员变量(只有一步)
而在构造函数体内做赋值的话,则编译器会先默认构造成员变量(一步),然后再做赋值(二步)
显然初始化的效率比较高,尤其是在成员变量中有比较大的自定义类型的时候,差别更加明显。
7.构造函数与重载
若类中有一个所有参数都带有默认参数的构造函数,同时自定义了一个无参数的默认构造函数:
如果代码中没有对构造函数的调用,则编译通过。
如果代码中有对构造函数的调用,则编译器报错。
这是因为虽然name mangling对两个参数不同的函数生成了不同的函数名,但在实际使用时发现同一个调用语句两个函数都符合,则编译器出现未决情况,报错
当构造函数遇上默认参数时,要注意防止未决情况
8.常对象的常量成员函数的设计意义
若调用者在构造对象时使用了const限定,则只能调用该对象的const成员函数,否则会报错“没有this指针的合法转换”
所以在设计类的时候,需要清楚用户是否有使用该类的const对象的需求。
9.传值和传引用的工程意义
传参时:
尽量使用传引用,相比于传值,可以避免大量的拷贝操作
而相比于传指针,引用的背后机制是常量指针,在实际使用时可以省去对指针的安全检查,代码更简洁,没有特别原因的话,优先使用传引用
返回值:
返回值传引用,可以是返回值作为左值使用
10.同一个类的不同对象互为友元
如题,同一个class的不同object互为friend,也就是假如c1和c2是同一个类的两个对象,则可以在c1中访问c2的private 成员变量。
11.使用临时变量而非引用传递的场景
如果运算的结果不是已经拥有空间的对象,那么运算一定不能反悔reference
比如 operator +, 就会返回临时对象,而不是引用。
12.重载全局函数而不是类成员函数的场景
operator << 和 operator >> 只能重载全局的,因为
1)不能在ostream类中对"<<“重载,因为ostream类已经被封装好了。
2)不能在Complex类中对”<<"重载,否则*this对象会混淆。