.
- explicit关键字
- C++ Primer
- extern关键字
- 指向常量的指针和指针常量
- const int*指向常量的指针,不能修改指向的值
- int\* const常量指针不能修改指向
- const int\* const指向常量的常量指针,啥啥都不能改
- constexpr
- 与const不同 constexpr int * 是说指向不可以改变,(蜜汁操作)
- 其他constexpr特性
- 请使用traits class来表现类型信息
- C++11 新特性
- learncpp
- c++之父的个人主页
- c++11 新特性
- 查看标准库是否支持
- cppreference
- 右值引用
- 完美转发
- 新特性
- C++强制类型转换
- static_cast、dynamic_cast、const_cast、reinterpret_cast
- 右值引用 完美转发
- 完美转发
- cppinsights编译过程查看
- 类模板cpp文件分离导致链接错误
- 常量指针和指向常量的指针
explicit关键字
用来放置类进行隐式转换
例如一个类有一个形参是int的构造函数
如下,在Pos的vector push的时候 ,直接使用一个int 就可以隐式转换为Pos
如果不想被隐式转换 就加上explicit关键字
#include <iostream>
#include <tuple>
#include <queue>
#include <stack>
#include <list>
using namespace std;
#define debug(x) cout<<#x<<": "<<(x)<<endl;
class Pos {
public:
Pos() {
}
Pos(int x) {
}
};
int main(int argc, const char* argv[]) {
vector<Pos> arr;
//arr.reserve(1e5);
for (int i = 0; i < 1e5; ++i) {
arr.push_back(1);
}
return 0;
}
编译成功!
#include <iostream>
#include <tuple>
#include <queue>
#include <stack>
#include <list>
using namespace std;
#define debug(x) cout<<#x<<": "<<(x)<<endl;
class Pos {
public:
explicit Pos() {
}
explicit Pos(int x) {
}
};
int main(int argc, const char* argv[]) {
vector<Pos> arr;
//arr.reserve(1e5);
for (int i = 0; i < 1e5; ++i) {
arr.push_back(1);
}
return 0;
}
编译失败!
C++ Primer
两万字吐血整理《C++ Primer》要点 - Jacenhu的文章 - 知乎
https://zhuanlan.zhihu.com/p/343271809
size_t cnt = 0;
for(auto &row : a)
for (auto &col : row){
col = cnt;
++cnt;
}
int *ip[4]; // 整型指针的数组
int (*ip)[4]; // 指向含有4个整数的数组
extern关键字
想要多个cpp文件共享一个变量,需要在h文件中间加上
a.h
extern int a; //声明
a.cpp
extern const int a = 5;// 定义
b.cpp
extern const int a = 5;// 定义 错误 已经在a.cpp定义过了
extern const int a; //正确,可以直接使用,值是5
指向常量的指针和指针常量
const int*指向常量的指针,不能修改指向的值
const int a = 4;
const int b = 3;
const int* cp = &a;
cp = &b;// 正确 指向可以改变
// int* p = &a; //错误 普通指针不能指向常量
int* const常量指针不能修改指向
int c = 1;
int d = 2;
int* const sp = &c;
// sp = &b; //错误,指向不能改变
const int* const指向常量的常量指针,啥啥都不能改
const int* const csp1 = &a; //正确,指向不能改,并且不能修改指向的值
const int* const csp2 = &c; //正确,指向不能改,并且不能修改指向的值
// csp1 = &b;//错误,指向不能改变
// *csp1 = 1;//错误,指向的值不能改变
可以用一个技巧技艺,const修饰的,先看左边,如果左边没有再看右边
例如 intconst 就是说 int是个常量,就是说指针本身(指向)不能改
const int p ,const后面跟着的是int 虽然也有*,但是这个一般认为是在p上的
所以就是说 int本身是个常量
constexpr
与const不同 constexpr int * 是说指向不可以改变,(蜜汁操作)
constexpr int *np = nullptr;//np是一个指向整数的常量指针,其值为空
int j= 0;
constexpr int i=42;//i的类型是整型常量
i和j都必须定义在函数体之外
constexpr const int *p = &i;//p是指针常量,指向整型常量i
constexpr int *p1 = &j; //p1是常量指针,指向整数j
其他constexpr特性
参见:https://zhuanlan.zhihu.com/p/268279204
请使用traits class来表现类型信息
effective c++ p.229
C++11 新特性
learncpp
c++之父的个人主页
c++11 新特性
https://www.stroustrup.com/C++11FAQ.html#learn
查看标准库是否支持
https://isocpp.org/blog/2014/03/compiler-support-for-c11-and-c14
https://www.italiancpp.org/wp-content/uploads/2014/03/CppISO-Feb2014-r1.pdf
cppreference
https://zh.cppreference.com/w/cpp/11
右值引用
https://zhuanlan.zhihu.com/p/85668787
完美转发
https://zhuanlan.zhihu.com/p/161039484
新特性
https://zhuanlan.zhihu.com/p/139515439
C++强制类型转换
static_cast、dynamic_cast、const_cast、reinterpret_cast
右值引用 完美转发
https://zhuanlan.zhihu.com/p/137662465
完美转发
可以写一个接受任意实参的函数模板,并转发到其它函数,目标函数会收到与转发函数完全相同的实参。
cppinsights编译过程查看
类模板cpp文件分离导致链接错误
https://stackoverflow.com/questions/115703/storing-c-template-function-definitions-in-a-cpp-file
常量指针和指向常量的指针
如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于的右侧,const就是修饰指针本身,即指针本身是常量。
https://light-city.club/sc/basic_content/const/