Chapter 3. C in C++
一、指针运算
//ptr_math.c
#include <iostream>
using namespace std;
#define P(EX) cout << #EX << ": " << EX << endl;
int main(void)
{
int a[10];
for (int i = 0; i < 10; i++)
a[i] = i;
int *ip = a;
P(*ip);
P(*++ip);
P(*(ip + 5));
int *ip2 = ip + 5;
P(*ip2);
P(*(ip2 - 4));
P(*--ip2);
P(ip2 - ip);
}
/* result:
*ip: 0
*++ip: 1
*(ip + 5): 6
*ip2: 6
*(ip2 - 4): 2
*--ip2: 5
ip2 - ip: 4
*/
C中强大的指针在C++里得到很好的保留,指针的灵活也给初学者带来困惑
1. `#EX'宏定义,此宏定义,将直接迭代打印变量名称(而不是变量值)
2. 指针是带有其类型信息的,根据信息,编译器理解指针运算的单位。
int *pi;
char *pc = (char*)pi;
pi++; //int型指针跳转4个字节
pc++; //char指针增加1个字节
二、介绍引用
//pass_reference.cpp
#include <iostream>
using namespace std;
void f(int& r) //reference
{
cout << "r = " << r << endl;
cout << "&r = " << &r << endl;
r = 5;
cout << "r = " << r << endl;
}
int main(void)
{
int x = 47;
cout << "x = " << x << endl;
cout << "&x = " << &x << endl;
f(x);
cout << "x = " << x << endl;
}
/* result:
x = 47
&x = 0xbfbb29ac
r = 47
&r = 0xbfbb29ac
r = 5
x = 5
*/
引用是C++中的新概念,相当于给变量起了一个新名字。通常用于参数传递。
* C中允许传值,和传址两中方式,在C++又包含了传递引用。
* 传递引用和传址不一样的是,调用方只是传递变量,而非该变量的指针,被调用函数则心
领神会,隐性得到参数地址(&r = &x)。
三、C++中的类型转换
//dynamic_cast.cpp
class Base
{
public:
int m_iNum;
virtual void foo() {}; //缺少虚函数会报错
};
class Derived: public Base
{
public:
char *m_szName[100];
};
int main(void)
{
Base *pb;
Derived *pd1 = static_cast<Derived *>(pb);
Derived *pd2 = dynamic_cast<Derived *>(pb);
}
(非TIC++代码)
dynamic_cast 是C++引入的类型转换方法,其他另外还有三个标准方法,这里将举例介绍
dynamic_cast和const_cast。
static_cast是静态类型转换,他仅要求:不可以在无关类型间转换。在基类和子类的指针
和引用转换过程中,其下行转换是危险的(即便可能通过),因为static_cast不会进行类
型转换。
dynamic_cast则弥补了这个缺陷,上下行转换都会进行类型检查,不符合的时候会返回NULL
指针,表明转换失败(而不是报错)。值得注意的是,下行转换的时候dynamic_cast要求基
类保留纯虚函数,否则会报错(因为纯虚函数拥有包含运行时类型信息的虚函数表,无虚函
数是没有虚函数表的)。
//const_cast.cpp
int main(void)
{
const int i = 0;
int *j = (int*)&i; // deprecated form
j = const_cast<int*>(&i); // preferred, only int* to int*
// long *l = const_cast<long*>(&i); // int* to long*? invalid!
volatile int k = 0;
int *u = const_cast<int*>(&k);
}
const_cast<TYPE>(expression)仍然是C++的标准类型转换方法。他用来转换const和
volatile(比如常量指针转换为非常量指针)。有一个要求,那就是要求TYPE和express类
型必须一致。
没有评论:
发表评论