.

  • 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

https://www.learncpp.com/

c++之父的个人主页

https://www.stroustrup.com/

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编译过程查看

https://cppinsights.io/

类模板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/