C++笔记

来源:互联网 发布:工作室网络施工方案 编辑:程序博客网 时间:2024/06/17 17:26

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;

}