- 浏览: 512547 次
- 性别:
- 来自: 北京
最新评论
-
jkxydp:
算法运行的结果根本就不对。
BM算法. -
soarwindzhang:
感谢博主的分享,我今天看了您的UFSET非递归的路径压缩时感觉 ...
并查集 -
zhangning290:
楼主好像只考虑了坏字符规则,。没有考虑好后缀
BM算法. -
lsm0622:
文字描述有错误 误导新学者
求有向图的强连通分量(scc):Tarjan算法 -
knightchen:
博主,你太强了!这篇文章对我学习C++多线程很有帮助!谢谢
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
文章列表
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& ...