设置结构体至少按多少字节对齐
struct alignas(8) S{};
求出结构体中最大字节的变量
自动判断变量的类型
auto a = 1.0 //此时的auto等效于float
函修饰符,用了之后函数编译前就可以确定返回的值
constexpr int factorial(int a);
char group[factorial(6)]; //这样就不会报错
//一般用法
print(decltype(int));
//常见用法
//根据a+b的类型确定返回值
template<typename T,typename U>
auto add(T a,U b)->decltype(a+b){
return a+b;
}
用于做类型转换,主要是将指向子类的父类指针转换为子类指针
Derived *d = dynamic_cast<Derived *>(b1); //失败返回空指针
枚举类型
enum Color{red,green,blue}; //默认从0开始赋初值
//如果两个enum有重复的要使用前缀
enum class Color1{red,green,blue};
enum class Color2{red,green,blue};
Color r = Color1::Blue;
用于声明命名空间,两个命名空间里可以声明相同的函数或变量
namespace XGroup{
class A{
int value;
};
}
namespace YGroup{
class A{
int value;
};
}
void testNamespace()
{
XGroup::A a;
YGroup::A b;
}
告诉编译器修饰的函数不会抛异常
专门的空指针关键字
如果一个类中调用了另一个类的指针,可以使用前置声明实现而不需要导入头文件,节省编译时间和内存空间
class RulOfFive;
class Test
{
private:
RulOfFive *rule;
};
explicit 的作用是表明构造函数是显示的,是明确的,不存在隐式的转换
class Parent()
{
public:
explicit Parent(const char* name):_name(name){}
private:
const char* _name;
};
class Child()
{
public:
explicit Child(const char* name,const char* school):Parent(name),_school(school){}
private:
const char* _name;
const char* _school;
};
}
构造函数从基类开始调用,析构函数从派生类开始调用
如果需要用指向派生类的基类指针做什么事情的话必须将基类的析构函数设置为virtual否则释放的时候只会调用基类的析构函数而不会调用派生类的析构函数
//取值
for(auto v:group)
{
}
//取引用
for(auto &v:group)
{
}
//取常引用
for(const auto &v:group)
{
}
//创建智能指针
auto p = make_shared<int>(3);
//智能指针的拷贝
auto q = p;
cout << *p;
//显示多少人占有该智能指针,应该显示为2
cout<<p.use_count();
//获得智能指针管理的裸指针
int* lp = p.get();
//释放原有指针或重新设置指针
p.reset(6); //设置新指针
p.reset(); //释放原有指针