`
kmplayer
  • 浏览: 512547 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
1,首先考虑一个问题: 型别T会影响class的行为吗? 如果不影响,你可以使用template. 如果影响,你必须使用虚拟函数,并因而使用继承机制. 2,来看一个模版的实例: #include <iostream> using namespace std; template<class T> class Stack { public: Stack(); void push(const T& t); T& pop(); T& top(); bool empty(); i ...
1,所谓laying,就是以一个class为本,建立另外一个class. 外层class含有内层class作为其数据成员. 例如: class Address { ... };           // where someone lives class PhoneNumber { ... }; class Person { public:   ... private:   string name;                   // layered object   Address address;               // ditto   PhoneNumber voice ...
1,首先可以安全的把问题讨论局限于"继承一个带有缺省参数的虚拟函数" 那么理由非常直接明了: 虚拟函数系动态绑定,而缺省参数却是静态绑定. 实例代码: #include <iostream> #include <string.h> using namespace std; enum ShapeColor { RED, GREEN, BLUE }; // a class for geometric shapes class Shape { public: virtual void draw(ShapeColor co ...
1,先看个例子: class B { public:   void mf();   ... }; class D: public B { ... }; D x; B *pB = &x;                   // get pointer to x D *pD = &x;                   // get pointer to x pB->mf();  pD->mf();    //如果D定义自己版本的mf,上述两个函数调用结果就会不同. 造成这一局面的原因:非虚拟函数如B::mf和D::mf是静态绑定. 即:调用哪个,取决于pB ...
1,public继承分为两类:接口继承和实现继承. 这两种继承的差异类似于函数声明和函数继承的差异. 2,你的可能需求: (1)希望只继承基类的接口; (2)希望继承基类的接口和实现,而且可以改写它们. (3)希望继承基类的接口和实现,但是不允许改写它们. 3,例子: class Shape { public:   virtual void draw() const = 0;   virtual void error(const string& msg);   int objectID() const;   ... }; class Rectangle: public Shape ...
1,C++面向对象程序设计最重要的原则: public继承意味着"是一种(isa)"的关系. 例如: class D : public class B 你便告诉编译器,每一个型别为D的对象同时也是型别为B的对象. 只要是B对象派得上用场的地方,D对象也可以派上用场. 2,看一个实际和理论偏离的例子: class Bird { public: virtual void fly(); //鸟可以飞 ... }; class Penguin : public Bird//企鹅是一种鸟, { ... } //但是是不能飞的. 可见"适用于所有软件"的完美 ...
1,考虑下面的代码: class string { operator char*() const; ... } const String B("Hello World"); char* str = B;//调用B.operator char*() strcpy(str, "Hi Tom"); 3,一个快速但是不正确的实现: inline String::operator char*() const {     return data; } 注:这个handler给了调用者无限制使用"私有字段data所指目标之物"的权利. 如下图 ...
1,namesapce的使用 namespace std{ int val; } 2,使用方法: (1)using namespace std; (2)using std::val; (3)std::val;
1,只推荐两本书: (1)D&E: The Design and Evolution of C++ (2)ARM: The Annotated C++ Reference Mannual
1,标准库的每一样东西几乎都在namespace std中,然而世界上有无可计数的C++程序代码依赖那些已经使用多年的“准“标准程序库,例如声明于<iostream.h>,<limits.h>等文件中的功能。 2,解决方法,设计新的头文件名,给披上std外衣的各个组件使用。 (1)将原有的c++头文件中的.h扩展拿掉,于是<iostream.h>变为<iostream>。 (2)C头文件采用相同办法,并在最前面加上一个字母c。于是<stdio.h>变为<cstdio> 3,关于标准程序库,必须知道的事情:几乎其中每一样东 ...
1,在你忽略一个警告之前,你必须精确了解编译器企图告诉你的是什么。 2,警告信息天生和编译器相依相靠,所以轻率地仰赖编译器为你找出程序错误,绝不是什么好主意。
1,当一个编译单元内某对象的初始化动作,与另一个编译单元内某对象的值相依,而后者也需要初始化。 可能导致第一个对象没有初值。 2,解决的办法:Singleton pattern。 将每一个non-local static object转到一个专属函数中,接下来令函数传回一个reference,指向内含的那个static object。 这样,客户不再直接取用static object,而是改调用函数。 依据:C++明确指出函数中的static对象的初始化时机:在函数调用期间第一次遇到对象的定义时。 这样做的另一个好处:如果从未调用带有非本地静态对象的函数,那么绝不会付出对象的构造和析构成本。 ...
1, class B; class A { public: A(const B&);//A可以根据B构造出来 }; class B { public: operator A() const; //B可以被转换为A }; void f(const A&); B b; f(b); //错误,模棱两可。 2,还发生在标准转换中。 例: void f(int); void f(char); double d = 6.02; f(d); //错误,模棱两可。 3,发生于“多重继承”。
1,先看一个例子: void f(int x); void f(string *ps); f(0);//调用哪个? 编译器选择f(int)。 很多情况下,存在模棱两可的情况。
1,一个空的class何时不为空? 当C++编译器处理过它们之后. 2,如果你这么写: class Empty{}; 其意义相当于: class Empty { public: Empty(); Empty(const Empty& rhs); ~Empty(); Empty& operator=(cosnt Empty& rhs); Emtpy* opertor&(); const Empty* operator& ...
Global site tag (gtag.js) - Google Analytics