C++是一个由多个次语言组成的整体,主要包括:
当在这些次语言间切换时,高效编程的要求可能会改变。
C风格函数:传值开销小
void fun2(int a) // 复制int的开销忽略不计
{
}C++类对象:传引用更高效
class Student
{
private:
string name = "张三";
string gender = "男";
int id = 0;
};
void func(Student& s) // 传引用避免拷贝开销
{
}每个次语言都有自己的规约,理解这一点有助于编写更高效的C++代码。
#define NUM 5#define MAXNUM(A,B) ((A)>(B)?(A):(B))const int num = 5;特殊情况:常量字符串
const char* const str = "hello"; // 指针和内容都不可修改常规写法:
class C
{
private:
static const int _a = 1; // 现代编译器支持
public:
int a[_a];
};对于老旧编译器,使用enum hack:
class C
{
private:
enum { _a = 5 }; // 使用匿名枚举替代
public:
int a[_a]; // 可以正常使用
};优点:enum hack不能取地址,更安全。
有问题的宏函数:
#define MAXNUM(A,B) ((A)>(B)?(A):(B))问题示例:
int a = 1, b = 2;
MAXNUM(++a, b); // a可能被多次递增
MAXNUM(++a, b+5); // 更复杂的副作用改为inline函数:
inline int maxnum(int a, int b)
{
return a > b ? a : b;
}或使用模板:
template<typename T>
inline T maxnum(const T& a, const T& b)
{
return a > b ? a : b;
}使用const、enum、inline替代#define的优势:
遵循这些准则能让你的C++代码更安全、更易于维护。