C++中的cast:
1) const_cast
2) dynamic_cast
3) static_cast
4) reinterpret_cast
C++中variable的definition, initialization, assignment
direct-initialization: int ival(1024);
copy-initialization: int ival=1024;
这一点与C#等有一些不同。
C#在定义的同时有默认的初始化操作,如int ival;在C#中默认会初始化为0。而在C++中只是变量的definition.
对于build-in 类型,这两者可以认为没有区别,对于class type,这两者是不同的。对于class type只能使用direct initialization. 也就是说direct-initialization在内部调用的是构造函数,而copy-initialization在内部调用的是assignment操作。
另外一点就是理解C++中initialization(copy constructor)与assignment有一些不同:
1) 赋值操作是在两个已经存在的对象之间进行的,而初始化是要创建一个新的对象,并且其初值来源于一个已存在的对象。
2) 编译器会区分这两种情况,初始化的时候调用copy constructor, 如果类中没有拷贝构造函数,则编译器会提供一个默认的,这个默认的拷贝构造函数只是简单的复制类中的每个成员。赋值的时候调用重载的赋值操作符。
以string为例来说明initialization与assignment的区别:
class String
{
public:
String (const char* init);
~String;
String(const String &that);
String &operator=(const String &that);
String &operator=(const char* str);
void swap(String &that);
friend const String operator+(const String &, const String &);
friend bool operator <(const String &, const String &);
//...
private:
String(const char*, const char*);
char s_;
}
Initialization :
String::String(const char* init)
{
if(!init) init="";
s_=new char[strlen(init)+1];
strcpy(s_, init);
}
Deconstructor:
String::~String()
{
delete[] s_;
}
Assignment:
String &String::operator=(const char* str)
{
if(!str) str="";
char* tmp=strcpy(new char[strlen(str)+1],str);
delete[] s_;
s_=tmp;
return *this;
}