Archive for ‘之语言特性’ Category

May 22, 2009

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

  • 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • 把空指针转换成目标类型的空指针。
  • 把任何类型的表达式转换成void类型。
Tags: ,. 31 views
May 17, 2009

前言

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。

当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。

言归正传,让我们一起进入虚函数的世界。

Tags: . 45 views
May 14, 2009

关联式容器associative container:

被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置,还有可能——每当新插入一个元素时,容器都会自动的按照某种排序规则将新来的元素放置在合适的位置。也即,这种容器内元素的排列顺序由容器自己的排序规则决定,操作者无能为力。

Tags: ,,. 339 views
May 13, 2009

经常有人要我(Bjarne Stroustrup)推荐一种C++的编译器。但是,我通常不会推荐任何编译器,因为我可能因此而在编译器的商战中表明”立场”。而且我并不是对所有的编译器都了解,C++编译器实在是太多了,我平时会用到半打(6个)C++ 编译器,但那只是”沧海一粟”罢了。
我希望人们在选择自己的编译器时,一定要严格参照现行的C++标准。尽量避免使用不支持或者违背ISO标准的编译器。
你如果是一个初学者而且不知道如何测验一个编译器是否符合标准的话,你可以试试下面这个小程序:

Tags: ,,. 154 views
May 12, 2009

有如下规则:

非静态数据成员被放在每一个对象体内作为对象专有的数据成员

静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。

静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。

因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。

成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

Tags: . 47 views

全局对象

在程序进入main()之前自动调用它们的相应构造函数来初始化,但是各个对象初始化的顺序不确定。直到main()函数结束后才会调用析构函数。

类的静态数据成员对象

等同于全局对象。

对象引用

其初始化和销毁均不会调用构造函数和析构函数,这使得引用传递比值传递更加地高效。

动态创建对象

调用new运算符时调用对象的构造函数。调用delete运算符时调用相应析构函数。

Tags: . 15 views

我的理解:

在main函数中由于定义了一个局部变量a,因此全局变量a被隐藏。int a = a;定义a(为a分配内存),然后用a(右侧的a)给a(左侧的a)赋值。所以这段代码是可以通过编译的,但是链接时候就会出错。因为,使用了一个未初始化的变量来给一个变量赋值。有可能在某些编译器上面是可以链接并运行的,说明它对变量的初始化不太严格。

Tags: ,. 16 views
May 11, 2009

Const in Header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//file header.h
static int global_count;
const int global_const_count = 7;
 
//file source1.cpp
#include "header.h"
 
int main()
{
    return 0;
}
 
//file source2.cpp
#include "header.h"

As we can see, both source1.cpp and source2.cpp include the definition of global_const_count, a const in C++ must default to internal linkage. That is, it is visible only within the file where it is defined and cannot be seen at link time by other translation units. But there won’t be two instances of the const. Normally, the C++ compiler avoids creating storage for a const, but instead holds the definition in its symbol table.

Tags: ,. 16 views
April 27, 2009

运行期(runtime)判断
下面的程序可以在运行期判断 endianess:

int IsBigEndian (void)
{
        static const int v =1;
        return *(char*)&v?0:1;
}
Tags: ,. 19 views
April 25, 2009

Introduction

A good way to get into an argument with a computer programmer is to attempt to explain why the language they are using is not as good as the one you are using. Most of the programmers I know are positively religious over their Operating System (see my other article), their development language and finally their text editor.

Tags: . 10 views
Page 8 of 9123456789