您需要注意的c++ 的11个要点

2020-02-21 22:13

您需要注意的c++ 的11个要点

您需要注意的c++ 的11个要点[转贴] 基础知识

下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要 的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。如:指向 成员的指针,这是许多资料中都不愿提到的地方,也是经常出错的地方,甚至是对 一些高级的C++程序员也是如此。

这里的要点不仅仅是解释怎样写出更好的代码,更多的是展现出语言规则里面 的东西。很显然,它们对C++程序员来说是永久的好资料。我相信这一篇文章会使 你收获不小。

首先,我把一些由不同层次的C++程序员经常问的问题归到一起。我惊奇的发 现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件 中。

要点1: 还是 ?

很多C++程序员还在使用而不是用更新的标准的库。

这两者都有什么不同呢?首先,5年前我们就开始反对把.h符号继续用在标准的头 文件中。继续使用过时的规则可不是个好的方法。从功能性的角度来讲, 包含了一系列模板化的I/O类,相反地只仅仅是支持字符

流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此, 和在接口和执行上都是不同的。最后,的各组

成都是以STL的形式声明的,然而的各组成都是声明成全局型的。

因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习 惯,在新的代码中一般使用,但如果你处理的是过去编写的代码,为了 继承可以用继续用旧保持代码的一致性。

您需要注意的c++ 的11个要点[转贴] 基础知识 下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要

的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。如:指向 成员的指针,这是许多资料中都不愿提到的地方,也是经常出错的地方,甚至是对 一些高级的C++程序员也是如此。

这里的要点不仅仅是解释怎样写出更好的代码,更多的是展现出语言规则里面 的东西。很显然,它们对C++程序员来说是永久的好资料。我相信这一篇文章会使 你收获不小。

首先,我把一些由不同层次的C++程序员经常问的问题归到一起。我惊奇的发 现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件 中。

要点1: 还是 ?

很多C++程序员还在使用而不是用更新的标准的库。

这两者都有什么不同呢?首先,5年前我们就开始反对把.h符号继续用在标准的头 文件中。继续使用过时的规则可不是个好的方法。从功能性的角度来讲, 包含了一系列模板化的I/O类,相反地只仅仅是支持字符

流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此, 和在接口和执行上都是不同的。最后,的各组

成都是以STL的形式声明的,然而的各组成都是声明成全局型的。

因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习 惯,在新的代码中一般使用,但如果你处理的是过去编写的代码,为了 继承可以用继续用旧保持代码的一致性。

要点2:用引用传递参数时应注意的地方

在用引用传递参数时,最好把引用声明为const类型。这样做的好处是:告诉 程序不能修改这个参数。在下面的这个例子中函数f()就是传递的引用:

void f(const int & i); int main() {

f(2); /* OK */ }

这个程序传递一个参数2给f()。在运行时,C++创建一个值为2的int类型的临 时变量,并传递它的引用给f().这个临时变量和它的引用从f()被调用开始被创建 并存在直到函数返回。返回时,就被马上删除。注意,如果我们不在引用前加上 const限定词,则函数f()可能会更改它参数的值,更可能会使程序产生意想不到的 行为。所以,别忘了const。

这个要点也适用于用户定义的对象。你可以给临时对象也加上引用如果是 const类型:

struct A{};

void f(const A& a); int main() {

f(A()); // OK,传递的是一个临时A的const引用 }

要点3:\逗号分离\表达形式

\逗号分离\表达形式是从C继承来的,使用在for-和while-循环中。当然,这 条语法规则被认为是不直观的。首先,我们来看看什么是\逗号分离\表达形式。

一个表达式由一个或多个其它表达式构成,由逗号分开,如:

if(++x, --y, cin.good()) //三个表达式

这个if条件包含了三个由逗号分离的表达式。C++会计算每个表达式,但完整 的\逗号分离\表达式的结果是最右边表达式的值。因此,仅当cin.good()返回 true时,if条件的值才是true。下面是另一个例子: int j=10; int i=0;

while( ++i, --j) {

//直到j=0时,循环结束,在循环时,i不断自加 }

要点4,使用全局对象的构造函数在程序启动前调用函数

有一些应用程序需要在主程序启动前调用其它函数。如:转态过程函数、登记 功能函数都是必须在实际程序运行前被调用的。最简单的办法是通过一个全局对象 的构造函数来调用这些函数。因为全局对象都是在主程序开始前被构造,这些函数 都将会在main()之前返回结果。如: class Logger {

public: Logger() {

activate_log();//译者注:在构造函数中调用你需要先运行的函数 } };

Logger log; //一个全局实例

int main() {

record * prec=read_log();//译者注:读取log文件数据 //.. 程序代码 }

全局对象log在main()运行之前被构造,log调用了函数activate_log()。从 而,当main()开始执行时,它就可以从log文件中读取数据。

毫无疑问地,在C++编程中内存管理是最复杂和最容易出现bug的地方。直接访 问原始内存、动态分配存储和最大限度的发挥C++指令效率,都使你必须尽力避免

有关内存的bug。

要点5:避免使用复杂构造的指向函数的指针

指向函数的指针是C++中可读性最差的语法之一。你能告诉我下面语句的意思 吗?

void (*p[10]) (void (*)());

P是一个\由10个指针构成的指向一个返回void类型且指向另一个无返回和无 运算的函数的数组\。这个麻烦的语法真是让人难以辨认,不是吗?你其实可以简 单的通过typedef来声明相当于上面语句的函数。首先,使用typedef声明\指向一 个无返回和无运算的函数的指针\: typedef void (*pfv)();

接着,声明\另一个指向无返回且使用pfv的函数指针\: typedef void (*pf_taking_pfv) (pfv);

现在,声明一个由10个上面这样的指针构成的数组: pf_taking_pfv p[10];

与void (*p[10]) (void (*)())达到同样效果。但这样是不是更具有可读性 了!

要点6:指向成员的指针

一个类有两种基本的成员:函数成员和数据成员。同样的,指向成员的指针也 有两种:指向函数成员的指针和指向数据成员的指针。后则其实并不常用,因为类 一般是不含有公共数据成员的,仅当用在继承用C写的代码时协调结构(struct)和 类(class)时才会用到。

指向成员的指针是C++语法中最难以理解的构造之一,但是这也是一个C++最强 大的特性。它可以让你调用一个类的函数成员而不必知道这个函数的名字。这一个 非常敏捷的调用工具。同样的,你也可以通过使用指向数据成员的指针来检查并改 变这个数据而不必知道它的成员名字。

指向数据成员的指针

尽管刚开始时,指向成员的指针的语法会使你有一点点的迷惑,但你不久会发 现它其实同普通的指针差不多,只不过是*号的前面多了::符号和类的名字,例: 定义一个指向int型的指针:

int * pi;

定义一个指向为int型的类的数据成员: int A::*pmi; //pmi是指向类A的一个int型的成员 你可以这样初始化它: class A {

public: int num; int x; };

int A::*pmi = & A::num;

上面的代码是声明一个指向类A的一个int型的num成员并将它初始化为这个num 成员的地址.通过在pmi前面加上*你就可以使用和更改类A的num成员的值: A a1, a2;

int n=a1.*pmi; //把a1.num赋值给n a1.*pmi=5; // 把5赋值给a1.num a2.*pmi=6; // 把6赋值给6a2.num

如果你定义了一个指向类A的指针,那么上面的操作你必须用 ->*操作符代 替:

A * pa=new A; int n=pa->*pmi; pa->*pmi=5;

指向函数成员的指针

它由函数成员所返回的数据类型构成,类名后跟上::符号、指针名和函数的参 数列表。举个例子:一个指向类A的函数成员(该函数返回int类型)的指针:

class A {

public: int func (); };

int (A::*pmf) ();

上面的定义也就是说pmf是一个指向类A的函数成员func()的指针.实际上,这 个指针和一个普通的指向函数的指针没什么不同,只是它包含了类的名字和::符 号。你可以在在任何使用*pmf的地方调用这个函数 func():

pmf=&A::func; A a;

(a.*pmf)(); //调用a.func()

如果你先定义了一个指向对象的指针,那么上面的操作要用->*代替:


您需要注意的c++ 的11个要点.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:大班主题背景下个别化学习活动的实践研究

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: