Posts Tagged C++ Primer

C++ Primer读书笔记(二)

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 »

, , , , , ,

1 Comment

C++ Primer 读书笔记(一)

扯淡论:

  高考结束那几天,去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 »

, , , , , , ,

3 Comments

C++类中成员的一个“Feature”

  这其实是我昨晚在写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 »

, , , ,

1 Comment