C++
文章平均质量分 73
饭团和蓝花
高效低调
展开
-
《Effective C++》之请记住
一,让自己习惯C++1,C++是一个语言联邦,包括C,Object-Oriented C++,Template C++和STL四个部分。C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。2,对于单纯常量,最好以const对象或enum替换#define。3,对于形似函数的宏(macro),最好改用inline函数替换#define.4,将某些东西声明为const可帮助编转载 2013-04-09 14:41:53 · 460 阅读 · 0 评论 -
Effective C++学记之02 使用const enums inline来代替#define
条款02 对于单纯常量,最好以const对象或enum替换#define;对于形似函数的宏,最好改用inline函数替换#define。1首先了解一下预处理和编译的区别:编译程序对源代码进行编译之前,即在语法分析、代码生成和优化之前,由预处理程序对源代码进行第一次处理。处理时,它忽略注释语句,加入.h头文件,并按定义进行替换。预处理的输出,即是编译程序的输入。预处理命令必须单行书写,不以分原创 2013-04-16 11:33:40 · 610 阅读 · 0 评论 -
Effective C++ 学记之11 在operator=中处理“自我赋值“
确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址,精心周到的语句顺序,以及copy-and-swap。确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象,其行为仍然正确。举几个潜在的自我赋值例子:①a[i]=a[j] //i=j的时候②*px = *py //*px 和 *py指向同一个对象原创 2013-05-06 16:21:15 · 570 阅读 · 0 评论 -
Effective C++ 学记之12 复制对象时勿忘其每一个成分
copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”。不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用。这里说的copying函数指的是“copy构造函数”和“copy赋值操作符”。前面的条款讲到,当用户自己定义copying函数时,编译器不会生成默认的cop原创 2013-05-07 13:31:56 · 612 阅读 · 0 评论 -
Effective C++ 学记之13 以对象管理资源
为防止资源泄露,请使用RAII对象,它们的构造函数中获得资源并在析构函数中释放资源。两个常被使用的RAII classes分别是trl::shared_ptr和auto_ptr。前者通常是较佳选择,以为copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。假设一个用来塑模投资行为(股票,证券等)的程序库,其中各式各样的投资类型继承自一个root原创 2013-05-08 11:04:38 · 536 阅读 · 0 评论 -
Effective C++ 学记之18 让接口容易被正确使用,不易被误用。
❀“促进正确使用”的方法包括接口的一致性,以及与内置类型的行为兼容。❀“阻止误用”的方法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。❀ tr1::shared_ptr支持订制型删除器,可防范DLL问题,可被用来自动解除互斥锁等。想开发一个“易被正确使用,不易被无用”的接口,首先必须考虑客户可能做出什么样的错误。比如设计一个表示日期的class设原创 2013-05-21 17:44:29 · 833 阅读 · 0 评论 -
Effective C++ 学记之14 在资源管理类中 小心 copying行为
复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法。不过其他行为也都可能被实现。auto_ptr和shared_ptr的观念表现在heap-head资源上。除此之外的其他资源而言,也可能我们需要创建自己的资源管理类。假原创 2013-05-09 14:31:58 · 660 阅读 · 0 评论 -
Effective C++ 学记之15 在资源管理类中提供对原始资源的访问
APIs 往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的方法。对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。前面条款13的例子中使用了智能指针如auto_ptr或tr1::shared_ptr保存createInvestment的调用结果:std::原创 2013-05-10 13:48:50 · 744 阅读 · 0 评论 -
Effective C++ 学记之16 成对使用new和delete时要采取相同形式
如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。std::string* strPtr1 = new std::string; std::string* strPtr2 = new std::string[100]; ...delete strPtr1; /原创 2013-05-13 12:11:16 · 606 阅读 · 0 评论 -
Effective C++ 学记之17 以独立语句将newed对象置入智能指针
以独立语句将newed对象置入智能指针内。如若不然,一旦异常被抛出,有可能导致难以察觉的资源泄露。来一例:int priority();//处理程序优先权的函数void processWidget(std::tr1::shared_ptr pw, int priority);//该函数在动态分配所得的Widget上进行某些带有优先权的处理。调用:processWidge原创 2013-05-15 10:37:53 · 593 阅读 · 0 评论 -
Effective C++ 学记之19 设计class犹如设计type
class的设计就是type的设计。在定义一个新type之前,请确定一下内容:1 新type对象应该如何被创建和销毁?需要考虑构造函数 析构函数 内存分配函数和释放函数 new new[] delete delete[] (在第八章详解)2 对象的初始化和对象的赋值该有什么样的差别?构造函数 赋值操作符的行为以及其间的差异。别混淆了“初始化”和“赋值”(条款4)原创 2013-05-29 11:42:29 · 669 阅读 · 0 评论 -
Effective C++学记之03 尽可能使用const
1 const和指针的关系对于我这个c++初学者来说,指针搭配常量让人有点小头疼。在描述一些概念比如“指向const的const指针”更让人大脑一时转不过来。看书中的例子:char greeting[] = "HELLO" char* p = greeting; //non-const pointer,non-const data原创 2013-04-19 10:37:20 · 564 阅读 · 0 评论 -
Effective C++学记之04 确定对象被使用前先被初始化
1 对内置类型进行手工初始化,因为c++不保证初始化它们。内置类型:int x = 0; //手工实现初始化通常如果使用c part of c++而且初始化可能招致运行期成本,就不保证发生初始化;一旦进入non-c part of c++,规则有些变化。这就很好的解释了为甚array(来自c part of c++)不保证其内容初始化,而vector(来自non-c part of原创 2013-04-19 14:56:31 · 556 阅读 · 0 评论 -
c++学习之标准库异常类
基类exception的接口定义如下: namespace std { class exception { public: exception() throw(); //原创 2013-04-09 16:23:44 · 606 阅读 · 0 评论 -
c++学习之异常处理
异常的捕获是严格按照数据类型匹配实现的,不允许类型转换,因此catch的参数必须有严格的数据类型。try{ throw 20;}catch(unsigned int){ //...}由于常量20的类型为int,而不是unsigned int 所以无法捕获,。如果函数抛出的异常找不到匹配的catch,则程序通常以abort()函数终止。异常使用原创 2013-04-09 18:08:06 · 472 阅读 · 0 评论 -
c++学习篇之【指针和引用】
1指针有自己的存储空间,它的内容是所指内存的地址,指向一块内存;引用是某块内存的别名,不占据实际的内存空间。2引用使用时无需解引用(*),指针需要解引用。3引用在定义时必须被初始化,之后不可变;指针可在任何时候被初始化,可随时改变所指的对象。4引用没有 const;指针有 const,const的指针不可变。 5引用总是指向一个对象,没有所谓的空原创 2013-03-28 11:41:40 · 469 阅读 · 0 评论 -
C++拷贝构造函数详解
该文章转载自http://blog.csdn.net/lwbeyond/article/details/6202256一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp] view plaincopyint a = 100; int b = a; 而类对象与普通对象不同,类对转载 2013-04-12 15:14:13 · 529 阅读 · 1 评论 -
Effective C++ 学记之10 令operator=返回一个 reference to *this
令赋值操作符返回一个引用 to *this例:int x,y,z;x=y=z=15; //连锁赋值赋值采用右结合律被解析为 x=(y=(z=15));为了实现“连锁赋值”,我们应该遵循这样一个协议:赋值操作符必须返回一个引用指向操作符的左侧实参。看下面的实现:class Widget{public: ... Widget& o原创 2013-04-27 17:15:55 · 523 阅读 · 0 评论 -
Effective C++学记之09 绝不在构造和析构过程中调用virtual函数
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至子类。例:股票交易买进卖出审计日志系统。class Transaction{public: Transaction(); virtual void logTransaction() const = 0; //做出一份因类型不同而不同的日志记录 ...};Transaction::原创 2013-04-27 11:51:56 · 564 阅读 · 0 评论 -
Effective C++学记之08 别让异常逃离析构函数
1 析构函数绝对不要突出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。2 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。例:数据库连接类class DBConnection{public: ... static原创 2013-04-25 10:33:41 · 544 阅读 · 0 评论 -
Effective C++学记之07 为多态基类声明virtual析构函数
1 polymorphic(带多态性质的)base classes应该声明一个virtual析构函数,如果class带有任何virtual函数,应该拥有一个virtual析构函数。class TimeKeeper{public: TimeKeeper(); ~TimeKeeper(); ...};class AtomicClock:public T原创 2013-04-24 11:19:38 · 465 阅读 · 0 评论 -
Effective C++学记之06 若不想使用编译器自动生成的函数,就应该明确拒绝。
如条款05所示,如果类中不声明copy构造函数和copy assign操作符,编译器会自动声明。那么对于一些独一无二的对象,如果不希望通过copy构造函数和copy assign操作符进行拷贝,该怎么做呢?为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。使用像如下Uncopyable这样的base class 也是一种做法。class Uncopya原创 2013-04-23 10:52:11 · 598 阅读 · 0 评论 -
Effective C++学记之05 编译器可以暗自为class创建default构造函数 copy构造函数 copy assignment操作符 析构函数。
编译器可以暗自为class创建default构造函数 copy构造函数 copy assignment操作符 析构函数。如果你写下class Empty{};等价于你写下:class Empty{public: Empty(){...} //default构造函数 Empty(const Empty& rhs){...} //copy 构造函数 ~原创 2013-04-22 14:16:24 · 659 阅读 · 0 评论 -
Effective C++ 学记之20 宁以pass-by-reference-to-const 替换 pass-by-value
尽量以pass-by-reference-to-const 替换 pass-by-value。前者比较高效,并可避免切割问题。【内置类型、STL的迭代器、函数对象】比较适合pass-by-value。--------------------------例:Student继承自Person,并拥有自己的schoolName和schoolAddress:class Pers原创 2013-06-19 17:03:30 · 760 阅读 · 0 评论