深入理解c++笔记
来源:互联网 发布:java 解决高并发 编辑:程序博客网 时间:2024/06/07 22:09
__func__ 函数名字
_Pragma #pragma宏
__VA_ARGS__ 不定参数宏
char可转wchar_t
_cplusplus c++宏
static_assert 静态断言
noexcept 是否允许异常关键字(std::terminate终止程序),
templat<class T>
void fun() noexpect(noexpect(T())) {}
快速初始化 类初始化列表优先于就地初始化
struct xxx{
string str{"abc"};
}
final 禁止重载
override 函数必须重载
extern template void fun<int> (int) 外部模板声明减少编译器工作量
继承构造函数 ,父类的默认参数是不会被继承,当多态继承时,构造函数签名冲突,可显式定义继承类冲突的构造函数
class A{
A(int){}
}
class B{
using A::A; // 继承构造函数,不会生成默认的构造函数
}
委派构造函数 不能有初始化列表,目标函数的异常会被委派构造函数捕获
class A{
A(){....}
A(int a):A(){}
}
class A{
A():A(1) {}
A(int a):A(a) {}
private:
A(int a) :m_a(a){.....};
int m_a;
}
移动构造
若无移动构造函数,Class A =std::move(x) 将调用 Class(const Class&)
type_traits
is_rvalue_reference
is_lvalue_reference
is_reference
utility
std::move
move_if_noexpect
完美转发 forward<>()
一旦出现左值引用就折叠为左值引用
自定义类型转换 operator ClassName TypeName(){}
explicit 禁用隐式构造,当用于类型转换操作符上时,只有在直接构造目标类型或显式类型转化时候才可以使用
花括号初始化列表 防止类型收窄
int a ={1};
int a{1};
initializer_list 淫技
POD类型 is_pod
平凡的: =default 或不声明 ,is_trivial判断是否平凡
1.有平凡的默认构造析构函数.
2.有平凡的拷贝构造移动构造函数
3.有平凡的拷贝赋值移动赋值函数
4.不含虚函数和虚基类
标准布局: is_standard_layout
1.所有非静态成员有相同的访问权限
2.基类和派生类只有一个包含非静态成员,且非静态成员不能出现在多个基类中. ps..非静态成员只能出现在一个结构中
3.类的第一个非静态成员类型不能与基类类型相同,c++要求类型相同的对象地址必须不同,当派生类第一个非静态成员类型是基类(一个不占空间的基类),编译器依然会给其分配空间 .p102页
4.没有虚函和虚基类
5.所有非静态数据成员,基类都符合标准布局.
编译器会删除一些非受限联合体的默认函数,当含义非POD成员时,会删除其非平凡的构造函数等..
自定义字面量: 字面量为整数 操作符函数只可以接受 unsigned long long 或 const char*,当溢出unsigned long long 时,编译器会转化为字符串并调用const char*参数版本函数
浮点型->long double 或者const char* (过长与上相同)
字符串->只可接受const char*,size_t 为参数的函数
字符->char
returnType operator ""(空格) XXX( type&&){}
inline namespace 声明一个内联命名空间,允许在父命名空间内定义或特化子命名空间的模板
参数关联名称查找:找不到函数名时可在参数的命名空间查找函数名称
is_same 判断两个类型是否相同
auto 类型占位符,不能从初始化表达式中带走cv限制符,加上引用则可以,用于赋值语句多个变量推倒时,变量类型必须相同,且推倒第一个类型作用与其他变量.
不能用作形参,结构体中非静态成员变量,数组,实例化模板时的模板参数
decltype(xxx) 从xxx推倒类型,会带走cv限制符,但结构成员不会继承cv限制符.会忽略沉余符号如cv,&
1.如果e是没有带括号的标记符表达式,或者类成员访问表达式,结果为e的实体类型,若e是被重载的函数,则编译错误
2.否则,e是将亡值,那么结果为T&&
3.否则,e是左值,则结果为T&
4.否则,e是类型T,则结果为T
template <class T1,class T2>
auto fun(T1 t1,T2 t2)->decltype(t1+t2) {}
auto (*)()->int(*)() 返回函数指针的函数 a函数
auto pf1()-> auto (*)()->int(*)()返回a函数的指针的函数
int (*(*pf())())() { ...}和上面的一样
result_of 推倒函数返回值类型
typeid 返回变量的type_info数据(类型名称,哈希值),is_same 模板是编译时返回,typeid 是运行时
for_each
template<class InputIterator, class Function>
Function for_each(
InputIterator _First,
InputIterator _Last,
Function _Func
);
for(type v : arr) v不是迭代器,是解引用后的对象,自己实现的类必须有begin end ++ == 函数
enum非强类型作用域允许隐式转换为整形
枚举类--强类型枚举 enum class Type: type {xxx}; type是底层类型,除wchar_t的任何整形 enum struct
具有1. 强作用域
2.转换限制
3.指定类型
constexper 编译时常量表达式关键字
常量表达式函数
1.函数体只有单一return
2.必须有返回值
3.return只含常量表达式
4.在使用前必须定义
常量表达式的构造函数
1.函数体为空
2.初始化列表必须为常量表达式赋值
constexper 元编程
stdarg,h va_list 变长参数 va_start ,va_arg取出参数
pair<T1,T2>两个不同类型的数据集合
tuple任意个不同类型数据的集合
变长模板
template <typename ... Elements>
sizeof...(args)
参数包展开位置
1.表达式
2.初始化列表
3.基类描述表
4.类成员初始化列表
5.模板参数列表
6.通用属性列表
7.lambda函数捕捉列表
Arg&&... ----> arg1&&,....argn&&
template <typename ...T>class A:B<T>...{}
template <typename ...T>class A:B<T1>,B<T2>,B<T3>,.... {}
template <typename ...T>class A:B<T...>{}
template <typename ...T>class A:B<T1,T2,T3.....>{}
template <typename ...T>
void DumpWrapper(T...t){}
template <typename ...A>
void fun(A...a){
DumpWrapper(F(a)....); // F(a1),F(a2).......顺序与编译器有关
}
递归和迭代解包
原子类型 cstdatomic.h std::atomic<T>
内存顺序 memory_order
TLS 线程独享变量 int thread_local xxx;
quick_exit 快速结束进程 不析构 at_quick_exit 注册清理函数
nullptr
构造函数名 = default ; 使编译器生成默认版本构造函数
函数名 = delete; 使编译器删除默认版本函数
class(int);
class(char c) = delete;禁用构造隐式转换 ,函数也可以
class xxx('c') ; 编译失败
explicit class(char c)=delete;
void fun(class o){}
fun('c'); 可以编译
void *operator new(size_t)=delete; 禁止在堆上创建对象
删除析构函数禁止在栈上或者静态创建变量, new(p) Class();假设其不需要析构函数
lambda 可以省略参数括号,在不捕获变量时,可以转换为函数指针,decltype可以获取其类型
[]() mutable{} 取消lambda表达式常量性
struct alignas(32) xxx{} 对其到32字节边界
alignof() 取类型对齐值
alignas()
[[noreturn]] 表明函数不会返回
__declspec( property( get = get, put = set ) ) int level;
__property int Data = {read=GetData, write=SetData};
volatile
static_cast 不带cv
const_cast 带cv限定符的转换
dynamic_cast 基类转子类 且有虚函数
reinterpret_cast 函数指针转换
_declspec
_attribute_
register
reinterpret_cast
dynamic_cast
volatile
placement new
^ 异或
- 陈皓《深入理解C语言》学习笔记
- 《深入理解C#》学习笔记之第一章
- 深入理解Oracle RAC 12c 笔记
- 深入理解 C 指针阅读笔记 -- 第一章
- 《深入理解C指针》学习笔记
- 深入理解Oracle 12c数据库管理 笔记
- 深入理解 C 指针阅读笔记 -- 第二章
- 深入理解 C 指针阅读笔记 -- 第三章
- 深入理解 C 指针阅读笔记 -- 第四章
- 深入理解 C 指针阅读笔记 -- 第五章
- 深入理解 C 指针阅读笔记 -- 第六章
- (C/C++学习笔记)临时对象深入理解
- (C/C++学习笔记)函数模板的深入理解
- 【c和指针学习笔记】深入理解字符串常量
- 深入理解C指针学习笔记(一)
- 深入理解C指针学习笔记(二)
- 深入理解C指针学习笔记(三)
- 深入理解C指针学习笔记(四)
- CodeChef Graphcnt:Counting on a directed graph(支配树)
- 视图观察者
- JS笔记 —— JS正则表达式大全
- LaTeX技巧一:如何在标题页面上创建背景图像?
- 使用原生js替换jQuery
- 深入理解c++笔记
- 总结一下linuxc常用操作命令
- Codeforces 848C Goodbye Souvenir
- 一个非常好的工具软件网站,小众软件
- 网络协议基础知识(一)
- MySQL中my.ini的位置
- CCF计算机软件能力认证模拟试题参考答案(JAVA)(201703 1+2)
- Android热修复原理
- 低通滤波器1