代码改变世界

随笔档案-2011年04月

Effective C++ 学习笔记(8)

2011-04-14 10:49 by Daniel Zheng, 234 阅读, 收藏, 编辑
摘要: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符 下面是一个表示String对象的类: class String { public: String(const char *value); ~String(); ... private: char *data; }; String::String(const char *value) { if(value) { data=new char[strlen(value)+1]; strcpy(data,value); } else { data=new char[1]; *data='\0'; } } inline Stri 阅读全文

Effective C++ 学习笔记(7)

2011-04-13 11:05 by Daniel Zheng, 225 阅读, 收藏, 编辑
摘要: 析构函数里对指针成员调用delete 大多数情况下,执行动态内存分配的类都在构造函数中使用new分配内存,然后在析构函数中使用delete释放内存。当这个类经过维护,升级后,情况将变得复杂。每增加一个指针成员都有进行如下的操作: 在每个构造函数中对指针初始化。指向相应的内存地址或者初始化为0,即空指针。 删除现有内存,通过赋值操作符分配给指针新的内存。 在析构函数里删除指针。 对于一个没有用到new去初始化的指针,不用delete去删除。 阅读全文

Effective C++ 学习笔记(6)

2011-04-13 10:17 by Daniel Zheng, 270 阅读, 收藏, 编辑
摘要: 对应的new和delete要采用相同的形式 我们看下面的代码: string *stringArray=new string[100]; ... delete stringArray; 上述代码看上去没错,实际上程序的运行情况将是不可预测的。stringArray指向的100个string对象中的99个不会被正确的摧毁,因为他们的析构函数永远不会被调用。 使用new的会触发两件事情。首先内存被分配,然后为被分配的内存调用一个或多个构造函数。同样,调用delete时也会触发两件事情。首先是为将被释放的内存调用一个或多个析构函数,然后是释放内存。这里,对于一个delete操作而言会有这么一个问题: 阅读全文

Effective C++ 学习笔记(5)

2011-04-13 09:53 by Daniel Zheng, 260 阅读, 收藏, 编辑
摘要: 尽量使用C++风格的注释 C风格的注释/* */在C++中仍然可以使用,但是推荐使用C++中的尾行注释。 很多时候,你需要去注释掉一些代码,使用C++风格的尾行注释如下: if(a>b) { //a=a^b; //swap a and b //b=a^b; //a=a^b; } 如果使用C风格的注释: if(a>b) { /*a=a^b; /*swap a and b*/ a=a^b; a=a^b; */ } 上述代码实际上注释的只是一行而已。 阅读全文

Effective C++ 学习笔记(4)

2011-04-12 21:47 by Daniel Zheng, 248 阅读, 收藏, 编辑
摘要: 尽量使用new和delete而不是malloc和free malloc和free是C语言对应的内存操作函数,在C++中无法在分配与释放内存是自动调用构造函数与析够函数。 使用malloc给10个string对象的数组分配内存: string *stringArray1=static_cast<string*>(malloc(10*sizeof(string))); stringArray1指向的内存空间的确可以容纳10个string对象,但没有创建这些对象,仅仅只是分配了这么大的内存空间而已。实际使用这些内存初始化数组里的对象将很困难。 使用new进行同样的操作: string * 阅读全文

Effective C++ 学习笔记(3)

2011-04-10 14:42 by Daniel Zheng, 284 阅读, 收藏, 编辑
摘要: 尽量使用<iostream>而不是<stdio.h> scanf与printf不是类型安全的,而且不具有扩展性。 <iostream.h>不是标准C++头文件,命名空间是全局。<iostream>命名空间是str::。 阅读全文

Effective C++ 学习笔记(2)

2011-04-10 13:31 by Daniel Zheng, 343 阅读, 收藏, 编辑
摘要: 尽量使用const和inline而不是#define 尽量使用编译器而不是预处理。 #define定义的宏不会加入符号表,不利于调试。 当使用#define定义常量时,使用const替代:#define ABC 123 => const int ABC=123;定义某个class常量时要同时用static与const修饰,以确保只存在一份拷贝。 当使用#define定义类似函数的宏时,用inline函数替代: 举例: 计算两个对象大小:#define max(a,b) ((a)>(b)?(a):(b)),对于这样的宏一定要加括号,因为预处理器只是完成简单的字符串替代,可能引起意想不 阅读全文

Effective C++ 学习笔记(1)

2011-04-09 19:49 by Daniel Zheng, 282 阅读, 收藏, 编辑
摘要: 视C++为一个语言联邦C。C++以C语言为基础。Object-Oriented C++。C with C++ 的特性:class,encapsulation,inheritance,polymorphism,virtual function等等。Template C++。Generic programming with C++。STL。A template library。 阅读全文
点击右上角即可分享
微信分享提示