`
kmplayer
  • 浏览: 512610 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
1,引起混淆基于一个事实:他们都允许以不同的形式调用同一个函数名称。 如: void f();                             // f is overloaded void f(int x); f();                                  // calls f() f(10);                                // calls f(int) void g(int x = 0);                    // g has a default                       ...
1,成员函数和非成员函数最大的区别:前者可以是虚拟函数,而后者不可以。 2,关于成员函数和非成员函数: 例子: class Rational { public: Rational(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const; .... const Rational operator*(const Rational& rhs) const; private:   ... }; 注意下面的调用: Rational oneEigh ...
1,实现的基本功能: 客户端:发送一行文本给服务器,服务器显示收到的字节数,并返回收到的内容给客户端。 2,一个单进程的实现实例: file echo.c: #include "csapp.h" void echo(int connfd) { size_t n; char buf[MAXLINE]; rio_t rio; Rio_readinitb(&rio, connfd); while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) ...
1,先看一个例子: class Month { public:   static const Month Jan() { return 1; }   static const Month Feb() { return 2; }   ...   static const Month Dec() { return 12; }   int asInt() const           // for convenience, make   { return monthNumber; }     // it possible to convert                              ...
1,inline函数:看起来像函数,动作起来像函数,比宏好得多,不需要蒙受函数调用带来的额外负担. 而且,编译器最佳化机制通常用来浓缩那些不含函数调用动作的代码,所以当你inline一个函数时,编译器就有能力在函数体身上执行某种最佳化. 2,inline函数背后的观念:将对函数的每一个调用行为都用函数代码取代之. 显然这么做,会增加你目标代码的大小. inline行为造成的程序代码膨胀可能会导致病态的换页,或是降低cache的命中率. 3,特别注意的是: inline指令就像register指令一样,只是对编译器的一种提示,而不是强制命令. 大部分编译器会拒绝将复杂的函数(内含循环或递归)i ...
1,解决之道: 将其声明为private,而且压根儿就不要定义它. 如: template<class T> class Array { private:   // Don't define this function!   Array& operator=(const Array& rhs);   ... }; 2,这种方法适用于任何一个由编译器产生的函数.
1,对象的by value传递,实际上就是copy constructor. 例如: Student returnStudent(Student s) { return s; } Student plato;                      // Plato studied under Socrates returnStudent(plato);               // call returnStudent 首先调用copy constructor将s初始化,然后copy constructor再次被调用,初始化返回值. 然后destructor s,还要destructor ...
1,只要某值真的保持不变,就应该明确表示出来,这样一来便可以获得编译器的帮助. 2,const最具威力的用途用在函数声明上. 3,令函数返回一个常量值,可以降低client的错误,有不至于放弃效率. 如: const Rational operator*(const Rational& lhs ...
1,"一致性"的角度:client存取某个member时,不用考虑是否使用小括号,因为所有东西都是函数. 2,使用函数可以更精确地掌握data member的可存取性. 让data member成为public,则每个人都可以直接读写它. 如果通过函数,可以实现"不处理","只读处理","可读可写","只写". 3,结论:把data members置于公开接口,等于是自找麻烦.应该将所有的data members隐藏起来.
1,所谓完满:允许clients做他们可以合理要求的任何事情. 2,最小化:尽可能让函数个数最少,不至于有任何两个member function功能重叠. 3,为什么要最小化呢? (1)接口函数越多,潜在客户越不容易了解它. (2可维护性较差.class内函数越多,越不容易避免到处重复的代码. (3)长长的class定义,会导致长长的头文件,导致编译时间过长. 因此,为接口增加函数时,并非不需成本. 你得谨慎考虑其额外的复杂性,可理解性,可维护性,以及编译速度的成本. 4,不要忘记,对实用目的而言,friend函数时class接口的一部分,这意味着friend函数应该被纳入class接口的完 ...
如何设计一个高效率的classes呢?考虑下面的问题: (1)对象应该如何产生和销毁? 影响你的constructor,destructor,operator new,operator new[],operator delete,和operator delete[]的设计. (2)对象的初始化和赋值有何不同? 影响你的constructor和assignment的行为. (3)对象by value传递 copy constructor定义值传递的意义. (4)对新型别而言,合法值的规范是什么? 影响你的member function内做哪些错误检验,也会影响函数抛出的exception. (5) ...
1,两个理由,赋值操作必须特别谨慎可能发生的别名问题. (1)效率,赋值操作中,如果一开始就检测到"自己赋值给自己",可以立刻返回. (2)assignment运算符在为其左侧对象配置新资源之前,通常必须先将原先配置给左侧对象的所有资源释放掉. 如: String& String::operator=(const String& rhs) {   delete [] data;    // delete old memory   // allocate new memory and copy rhs's value into it   data = new ...
1,先看一个错误的情况: class Base { public:   Base(int initialValue = 0): x(initialValue) {} private:   int x; }; class Derived: public Base { public:   Derived(int initialValue)   : Base(initialValue), y(initialValue) {}   Derived& operator=(const Derived& rhs); private:   int y; }; Derived& D ...
1,assignment动作可以串连在一起. string w, x, y, z;  w = x = y = z = "Hello"; 赋值使用右结合律,上述行动串被解析成这样: w = (x = (y = (z = "Hello"))); 或是: w.operator=(x.operator=(y.operator=(z.operator=("Hello")))); 可见:y.operator=的引数就是前次调用operator=后的传回值. 2,常犯的错误: (1)令opertor=传回void,它会妨碍assignment动作 ...
先看一个例子: class EnemyTarget { public:   EnemyTarget() { ++numTargets; }   EnemyTarget(const EnemyTarget&) { ++numTargets; }   ~EnemyTarget() { --numTargets; }   static size_t numberOfTargets()   { return numTargets; }   virtual bool destroy();                 // returns success of                  ...
Global site tag (gtag.js) - Google Analytics