2009年11月18日(admin)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| #include <iostream>
using namespace std;
class A
{
public:
int _a;
A()
{
_a = 1;
}
void print()
{
cout << _a << endl;
}
};
class B : public A
{
public:
int _a;
B()
{
_a = 2;
}
};
int main()
{
B b;
b.print();
cout << b._a << endl;
return 0;
} |

print() 访问的永远是 A 域里的 _a
C++ Primer(第三版中文版) p738 提到:
虽然基类的成员可以被直接访问,但是它们仍然属于基类的域。
关键就在“域”,B 的 print() 并不是直接把父类 A 的 print() 复制过来,而是直接访问的 A 域的 print()
纯属个人意见……
分类:C++ | 暂无评论 »
2008年09月18日(admin)
转:http://www.21andy.com/blog/20080605/1155.html
主要用于代码块注释:
/**
code;
code;
code;
…
/**/
当调试或者功能完成后,不再需要注释时
只需在 /** 后加一斜杠,变成
/**/
code;
code;
code;
…
/**/
谁用谁知道
如果喜欢,可以多加N个星号。。。
分类:C++ | 暂无评论 »
2008年03月12日(admin)
C++ 回顾
1. L’a’ //宽字符型
2. 3.14e1L //L是修饰e后的1的
3. 3.14uL // 错误,双精度不能用 unsigned 修饰
4. int ival=ival; // 合法的 。。。
5. cin>> int a; // 错误
6. vector<int>_ ; // 合法
7. && || 最短路径算法?
分类:C++ | 暂无评论 »
2008年03月06日(admin)
关于 do {} while(0) 的妙用。
http://hi.baidu.com/feizhou_/blog/item/b784a00096992f12728b65f0.html
如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do…while(0)或do…while(false), 比如说:
#define AFXASSUME(cond) do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assume(__afx_condVal); } while(0)
粗看我们就会觉得很奇怪,既然循环里面只执行了一次,我要这个看似多余的do…while(0)有什么意义呢?
当然有!
为了看起来更清晰,这里用一个简单点的宏来演示:
#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)
假设这里去掉do…while(0),
#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p) SAFE_DELETE(p)
else …do sth…
就有两个问题,
1) 因为if分支后有两个语句,else分支没有对应的if,编译失败
2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。
你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do…while, 我直接用{}括起来就可以了
#define SAFE_DELETE(p) { delete p; p = NULL;}
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:
if(NULL != p) SAFE_DELETE(p);
else …do sth…
其else分支就无法通过编译了(原因同上),所以采用do…while(0)是做好的选择了。
也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do…while了,如:
if(…)
{
}
else
{
}
诚然,这是一个好的,应该提倡的编程习惯,但一般这样的宏都是作为library的一部分出现的,而对于一个library的作者,他所要做的就是让其库具有通用性,强壮性,因此他不能有任何对库的使用者的假设,如其编码规范,技术水平等。
继续阅读 »
分类:C++ | 暂无评论 »
2008年03月03日(admin)
const
类的成员函数后加const表示该函数不会修改成员变量
特例:该函数中 定义指针(假定有类Date)
Date *p=const_cast<Date*>(this);
p可以操作成员变量。(强制去掉只读属性)
指针变量不要指向表达式返回的临时对象,因为表达式完成后该对象会被销毁。
标签:const_cast
分类:C++ | 暂无评论 »