Posts Tagged C++ Primer
C++ Primer读书笔记(二)
Posted by kingsamchen in PROGRAMMING on 2010 年 06 月 27 日
1:reinterpret_cast转换类型
众所周知,C++中增加了新的并且也是更安全的类型转换功能。而reinterpret_cast则是新增转换功能中比较难把握的一个。
和static_cast的便于直观理解不同,reinterpret_cast有着很多特殊的地方。
首先,reinterpret_cast只能用于指针类型的转换,而且不能是NULL指针。其次,reinterpret_cast转换实际上是一种“欺骗式”转换,思考下列代码:
int* ip; char* pc = reinterpret_cast<char*>(ip);
由于ip和pc不是同一种指针类型,编译器抱怨道:这俩不是同一家,咋办呢?于是一旁的reinterpret_cast骂到:等你妹啊,你丫管那么多干嘛,直接在内存中复制Bit位就好了。
然后编译器就不管三七二十一,把ip内存中的数据一模一样的搬给了pc。
虽然pc和ip的二进制内容一样,但是无法被解释成char*,他仍然是int*,也就是说,类型不会发生改变。reinterpret_cast干了这么多,真是强行骗过了编译器。
由于这个特性,reinterpret_cast实际上是非常不安全的,因为Coder必须知道原来的类型,否则就很容易发生不可预期的问题。
啥叫不可预期?就是开发时运行良好,调试时运行良好,结果在你最重要的顾客脸上爆炸。(其实reinterpret_cast引发的错误很容易表现……)
Read the rest of this entry »
C++ Primer 读书笔记(一)
Posted by kingsamchen in PROGRAMMING on 2010 年 06 月 19 日
扯淡论:
高考结束那几天,去AMAZON上买了一堆书,既然不能像某人一样去把妹,那就只能挖粪涂墙去了~
虽然KC偶写C++也写了差不多2年了,但是真正正规的去翻一本C++教材还真没做过,虽然之前找到了电子版的C++ Primer,但是一直把他当作Document来用,并同众人美其名曰“砖书”。
所谓砖书,指的就是那种厚重的,详尽到烦死你的书,这种书可以当砖头来砸人。但是现在一切都不同了,既然KC决定选择计算机作为自己未来的方向,就自然不能同往日那样靠着一点小聪明打游击,所以,该怎么学还是要怎么学~
于是,就有了这些系列的读书笔记(寒假时候也同样写过几篇CLRS的读书笔记)。
当然,由于KC对C++基本已经可以算是驾轻就熟,所以笔记中讨论的大多都是容易忽略和不常见但是有意思的问题~
深沉论:
1:整型的赋值
看到这个题目,不要觉得惊讶。虽然KC有时候很无聊(无聊主要来源于寂寞……),但是在这里我们不是要讨论那种类似int a = 123;的无聊问题。而是一些很特殊的情况。
unsigned char a = -1; char b = 1023; wcout<<(int)a<<endl<<(int)b<<endl; // guess,what does it output?
如果我问你,上面输出的结果是什么,你能回答么?
应该说,很多人都很迷茫,包括曾经我自己对于上面的问题都仅限于知道会发生数据截断,但是到底结果是什么,还真无法回答。不过万幸啊,不知道什么的,都会变成浮云~
Read the rest of this entry »
C++类中成员的一个“Feature”
Posted by kingsamchen in PROGRAMMING on 2010 年 06 月 17 日
这其实是我昨晚在写CBigInt的operator+的时候碰到的一个比较郁闷的问题
先看一段代码:
#include <string>
#include <iostream>
using namespace std;
int main()
{
T c;
cout<<c.Put(); // first position
c.a(); // second position
return 0;
}
class T
{
public:
int Put()
{
T t;
return t.a(); // look at here
}
private:
int a()
{
m_n = 5;
return m_n;
}
int m_n;
};
这段代码能正常运行么?答案显然是否定的
但是,第一处的代码是没问题的,第二处才有问题。
按照个人以往对于private/protected的理解是,在类内部可见,外部不可见。即,外部的类对象不能直接调用private或protected类型的成员。按照这一规定,很显然,第二处直接调用私有成员函数是不合法的,因为编译器会给错。
Read the rest of this entry »

COMMENTS