classType& classType::assign( const classType &source )
{
if ( this != &source )
{
this->~classType();
new (this) classType ( source ); //(source)是什么?
}
return *this;
}
不懂这个例子
int型的 const 静态数据成员可以在类体中用一常量值初始化 。
用常量值作初始化的int类型的 const 静态数据成员是一个常量表达式,
如果需要在类体中使用这个被命名的值 那么 类设计者可声明这样的静态数据成员。
union 不能有静态数据成员或是引用成员,如果一个类类型定义了构造函数、 析构函数、或拷贝赋值操作符 ,则它不能成为 union 的成员类型。
名字空间类的非 inline 成员函数和静态数据成员也是程序实体 但是 在整个程序中只能为这些成员提供一个定义, 因此这些成员的定义不应该被放在头文件的类定义中 而是放在它们自己单独的文本文件中 比如程序文本文件 primer.C 中。
因为没有语法能够在名字空间域内定义局部类的成员 所以也不允许局部类声明静态数据成员。
每个派生类都必须提供自己的构造函数集。派生类构造函数只能合法地调用其直接基类的构造函数。 虚拟继承为这条规则提供了一个特例 正如它对许多其他规则所做的一样。
建议将类层次结构的根基类(声明了一个或多个虚拟函数)的析构函数声明为虚拟的. 但是, 不像基类的构造函数, 一般地,基类的析构函数不应该是 protected.
new 操作符不能被声明为虚拟的, 因为它是一个静态成员函数,在构造类对象之前被应用到未使用的内存上.
对于 "要求派生类的返回类型必须与其基类实例的返回类型完全匹配",有一个例外, 这个例外就是用来支持这种情况的 如果虚拟函数的基类实例返回一个类类型, 或指向类类型的指针或引用 , 则派生类实例可以返回一个 从基类实例返回的类公有派生出来的类, 或指向类类型的指针或引用.
{转载]static_cast 有什么好处?
总的来说,应该尽量避免类型转换(dynamic_cast 除外)。使用类型转换常常会引起类型错误或者数值截断。甚至于看起来“无辜”的类型转换也有可能变成很严重的问题,如果在开发或者维护期间,其中一个相关的类型改变了的话。例如,下面这个是什么意思:
x = (T)y;
我们不得而知。这取决于类型 T 以及 x 和 y 的类型。T 可能是类的名字、typedef 或者模板参数。可能 x 和 y 都是标量变量,而 (T) 代表值的转换。也可能 x 是 y 的派生类的对象,而 (T) 是一个向下转换(downcast)。还可能 x 和 y 是不相关类型的指针。由于 C 风格的类型转换 (T) 可用于表述很多逻辑上不同的操作,所以编译器很难捕捉误用。同样的道理,程序员不可能精确地知道类型转换到底做了什么。有些菜鸟程序员认为这是一个有利条 件,但假若他们错误地判断了形势,将会导致许多细微的错误。
“新风格的类型转换”因此应运而生,它给予了程序员更清晰地表达他们的真实意图的机会,也使得编译器能捕捉到更多错误。例如:
int a = 7;
double* p1 = (double*) &a; // ok(但指向的并非 double 类型的对象)
double* p2 = static_cast<double *>(&a); // 错误
double* p2 = reinterpret_cast<double *>(&a); // ok:我真的想这么干
const int c = 7;
int* q1 = &c; // 错误
int* q2 = (int*)&c; // ok(但 *q2=2; 仍然是不合法的代码,而且有可能失败)
int* q3 = static_cast<int *>(&c); // 错误:static_cast 不能去除 const 属性
int* q4 = const_cast<int *>(&c); // 我的确想这么干
static_cast 所允许的转换都比需要使用 reinterpret_cast 才能进行的转换更安全,更不易出错。大体上,可以直接使用 static_cast 转换后的值,而无需将其再转换成原来的类型。而由 reinterpret_cast 得到的值却总是应该被转换成原来的类型后才使用,这样才能确保可移植性。
引入新风格类型转换的第二个原因是,C 风格的类型转换在程序中难以被发现。例如,在普通的编辑器或者文字处理软件里,你不能方便地查找类型转换。C 风格类型转换的这一隐秘性实在是糟透了,因为类型转换潜在着极其高的破坏性。丑陋的操作应该使用丑陋的语法形式。这个事实也是选择新风格类型转换语法的部 分依据。更深一层的原因是,让新风格的类型转换语法和模板语法一致,这样程序员就能编写自己的类型转换,尤其是带运行时检查的类型转换。
或许,因为 static_cast 很难看,而且也相对难拼,所以你更可能会充分考虑后才决定是否使用它?这很好,因为现代 C++ 里,类型转换真的是最容易避免的
restrict关键字从C99才开始支持,C89是没有的:
An object that is accessed through a restrict-qualified pointer has a special association with that pointer. This association, defined in 6.7.3.1 below, requires that all accesses to that object use, directly or indirectly, the value of that particular pointer. The intended use of the restrict qualifier (like the register storage class) is to promote optimization, and deleting all instances of the qualifier from all preprocessing translation units composing a conforming program does not change its meaning (i.e., observable behavior).
restrict表示只能通过它限定的指针访问该指针所指向的对象。
Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象它是一个全局变量。只要access level允许,任何函数都可以存取static成员变量。
但是如果你希望在产生任何对象之前就存取其class的private static成员变量,则必须设计一个static成员函数:由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它
暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。