平凡的和标准布局的——貌似和深度探索C++对象模型中关于按位拷贝冲突
#include
:
templatestruct std::is_trivial
的成员value可以用于判断T类型是否是一个POD类型;除了类和结构体之外,is_trivial可以对内置的标量类型数据及数组类型进行判断templatestruct std::is_standard_layout
的value可以判断类型是否是一个标准布局的类型templatestd::is_pod::value
可以判断一个类型是否是POD,T可以是基本类型T&& t = ReturnRValue();
函数返回的右值在表达式语句结束后生命就结束了,通过右值引用的声明,该右值又重获新生,其声明周期和右值引用类型变量t的生命周期一样,不过需要注意,能够声明右值引用t的前提是ReturnRvalue返回的是一个右值int c; int &&d=c;
是不能通过编译的T& e = ReturnRvalue(); // 编译错误
const T& f = ReturnRvalue(); // 编译成功,常量左值引用在C++98中是个万能的引用类型,可以接受非常量左值,常量左值,右值对其进行初始化,而且在使用右值对其进行初始化的时
// 候常量左值引用还可以像右值引用一样将右值的生命期延长。
所以说,在定义一个移动构造函数的时候,定义一个常量左值引用的拷贝构造函数,是一种非常安全的设计——移动不成还可以执行拷贝
const bool & judge = true;
const bool judge2 = true;
// 上面两条的区别就是:前者直接使用右值并为其续命,后者的右值在表达式结束后就销毁了
#include
,通过类模板的成员value获取
static关键字用于内部链接(静态链接)
static inline int a{0};
extern关键字好像是static的反义词,将他后面的名称指定为外部链接。在某些情况下可以使用这种方法,如,默认情况下,const和typedef具有内部链接,可以使用extern使其变为外部链接。
当指定某个名称为extern时编译器会将这条语句当作声明,而不是定义。对于变量这意味着编译器不会为其分配空间,必须为这个变量提供单独的,而不是使用extern关键字的定义行。例如:
extern int x;
int x = 3;
或者,可以在extern语句中初始化x,让后将其作为声明和定义
extern int x = 3;
但在这种情况下,x不是特别有用,因为x本身具有外部链接
const int &r = 42;
常量值(右值)作为实参传递给const T&也是允许的int i = 42;
const int v = i; // 可以用非const变量初始化const变量
int j = v; // 可以用const变量初始化非const变量
但注意拷入和拷出的对象必须具有相同的底层const,将底层const类型给非const类型是不允许的
int *const a = new int{2};
int *b = a; // ok,将顶层const指针给非const指针
int *const c = b; // ok,将非const指针给顶层const指针
int const* d = new int{3};
int* e = d; // error,将底层const指针给非const指针
int const* f = b; // ok,将非const指针给底层const指针
int g = 4;
const int& h= g; // ok,将非const引用给const引用
int & i = h; // error,将const引用给非const引用
const A *const
),这一情况使得不能在一个常量对象上调用普通的成员函数class Foo
{
public:
Foo(const volatile Foo&);
Foo& operator=(volatile const Foo&);
Foo & operator=(volatile const Foo&) volatile;
};
一种节省空间的类
类定义不仅可以包含成员函数和数据成员,还可以编写嵌套类、嵌套结构体、枚举类型、声明类型别名
class MyClass {
public:
class QianTao;
...
};
class MyClass::QianTao { ... };
const char *a = "hello";
cout << sizeof(a) << endl; // 输出6
cout << strlen(a) << endl; // 输出5
for (int elem : coll1) {
cout << elem << " ";
}
class File
{
unsigned int mode: 2; // mode占2位
unsigned int modefied: 1;
unsigned int prot_owner: 3;
unsigned int prot_group: 3;
unsigned int prot_world: 3;
public:
enum modes { READ = 01, WRITE = 02, EXECUTE = 03 };
File &open(File::modes m) {
mode |= READ;
// TODO 其他处理
if (m & WRITE) {
return *this;
}
}
inline bool isRead() const { return mode & READ; }
inline void setWrite() { mode |= WRITE; }
};
,所有文件都在std命名空间和std的子命名空间中定义。std::numeric_limits::infinity
摘自:http://blog.csdn.net/frankiewang008/article/details/7481865
#ifndef UNUSED_ARG
#define UNUSED_ARG(arg_) (void)(arg_)
#endif /* UNUSED_ARG */
UNUSED_ARG(size);
自由函数(free function):C++中的非成员函数都是free function