C++编程技术提升点:
1.*.h头文件中使用#pragma once代替(#ifndef,#define,#endif)
因为:当某个头文件被多次include时,只要在头文件的最开始加入#pragma once就能够保证头文件被编译一次,可加快编译速度;另外,#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上每个编译器都有这个定义了。当然若某编译器没有这个定义,则使用#ifndef,#define,#endif这种方式。
2.智能指针:shared_ptr\weak_ptr\unique_ptr
3.左值引用和右值引用
左值引用和右值引用都是别名,左值引用是在类型后面加一个&,右值引用是在类型后面加两个&&。
左值引用和右值引用本质的作用都是减少拷贝。右值引用弥补了左值引用的不足。右值引用提高了传值返回的效率。
左值和右值是不好区分的,这里我们一般这样认为:
左值:一般是可以修改的值,可以取地址的,通常是变量。
右值:一般是常量(除const 修饰的),表达式或者函数的传值返回(生成临时变量)。
注意:传引用返回是右值。
C++11有对右值进行了严格的区分:
纯右值:比如常量,表达式值a+b
将亡值:比如函数传值返回,表达式的中间结果。顾名思义,将亡值的空间马上就要被释放了。
验证结果如下为啥true or false
#include
int main() {
int a=10;
int &a1 = a; // true
std::cout << &a1 << std::endl;
int &&a4 = 10; // true
std::cout << &a4 << std::endl;
auto &a5 = a; // true
std::cout << &a5 << std::endl;
auto &&a7 = a; // true
std::cout << &a7 << std::endl;
auto &&a8 = 10; // true
std::cout << &a8 << std::endl;
const int &a9 = a; // true
std::cout << &a9 << std::endl;
const int &a10 = 10; // true
std::cout << &a10 << std::endl;
const int &&a12 = 10; // true
std::cout << &a12 << std::endl;
const auto &a13 = a; // true
std::cout << &a13 << std::endl;
const auto &a14 = 10; // true
std::cout << &a14 << std::endl;
const auto &&a16 = 10; // true
std::cout << &a16 << std::endl;
// int &a2 = 10; // false
// std::cout << &a2 << std::endl;
// int &&a3 = a; // false
// std::cout << &a3 << std::endl;
// auto &a6 = 10; // false
// std::cout << &a6 << std::endl;
// const int &&a11 = a; // false
// std::cout << &a11 << std::endl;
// const auto &&a15 = a; // false
// std::cout << &a15 << std::endl;
return 0;
}
4.移动语义和完美转化
5.运算符重载
6.友元函数和友元类
使用friend关键字;声明为友元函数或友元类,可以访问类的私有成员和受保护成员;
#.待补充