C++程序员经常问的11个问题
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 1 of 8
C++程序员经常问的11个问题
下面的这些要点是对所有的C++
因为这些要点中提到的是你通常在C++
高级的C++程序员也是如此。
++程序员来说是永久的好资料。我相信这一篇文章会
使你收获不小。
++程序员经常问的问题归到一起。我惊奇的发
现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件
中。
要点1: 还是 ?
很多C++
...
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 1 of 8
C++程序员经常问的11个问
下面的这些要点是对所有的C++
因为这些要点中提到的是你通常在C++
高级的C++程序员也是如此。
++程序员来说是永久的好资料。我相信这一篇文章会
使你收获不小。
++程序员经常问的问题归到一起。我惊奇的发
现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件
中。
要点1: 还是 ?
很多C++
5年前我们就开始反对把.h符号继续用在标准的头文件中。继续使用过时的
< iostream>包含了一系列模板化
的I/ ++标准规范接口在
以用继续用旧保持代码的一致性。
要点2
void f(const int & i);
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 2 of 8
int main()
{
f(2); /* OK */
}
这个程序传递一个参数2 ++创建一个值为2的int类型的临
.这个临时变量和它的引用从f()被调用开始被创建
这个要点也适用于用户定义的对象。你可以给临时对象也加上引用如果是
struct A{};
void f(const A& a);
int main()
{
f(A()); // OK,传递的是一个临时A的const引用
}
要点3
-和while-
式。
if(++x, --y, cin.good()) //三个表达式
这个if条件包含了三个由逗号分离的表达式。C++
.good()返回
int j=10;
int i=0;
while( ++i, --j)
{
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 3 of 8
// 0
}
要点4
记功能函数都是必须在实际程序运行前被调用的。最简单的办法是通过一个全局
class Logger
{
public:
Logger()
{
activate_log();//
}
};
Logger log; //一个全局实例
int main()
{
record * prec=read_log();//
//.. 程序代码
}
++编程中内存管理是最复杂和最容易出现bug的地方。直接
访问原始内存、动态分配存储和最大限度的发挥C++
免有关内存的bug。
要点5
指向函数的指针是C++中可读性最差的语法之一。你能告诉我下面语句的意思
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 4 of 8
void (*p[10]) (void (*)());
P是一个“由10个指针构成的指向一个返回void类型且指向另一个无返回和无
typedef void (*pfv)();
typedef void (*pf_taking_pfv) (pfv);
10
pf_taking_pfv p[10];
与void (*p[10]) (void (*)())达到同样效果。但这样是不是更具有可读性
要点6
指向成员的指针是C++ ++最
强大的特性。它可以让你调用一个类的函数成员而不必知道这个函数的名字。这
查并改变这个数据而不必知道它的成员名字。
指向数据成员的指针
*号的前面多了::
int * pi;
int A::*pmi; //pmi是指向类A的一个int型的成员
class A
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 5 of 8
{
public:
int num;
int x;
};
int A::*pmi = & A::num;
上面的代码是声明一个指向类A的一个int型的num成员并将它初始化为这个
num成员的地址.通过在pmi前面加上*
A a1, a2;
int n=a1.*pmi; //把a1.num赋值给n
a1.*pmi=5; // 把5赋值给a1.num
a2.*pmi=6; // 把6赋值给6a2.num
->*操作符代
A * pa=new A;
int n=pa->*pmi;
pa->*pmi=5;
指向函数成员的指针
::符号、指针名和函数的
class A
{
public:
int func ();
};
int (A::*pmf) ();
上面的定义也就是说pmf是一个指向类A的函数成员func()的指针.
::符
号。你可以在在任何使用*pmf的地方调用这个函数
pmf=&A::func;
A a;
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 6 of 8
(a.*pmf)(); //调用a.func()
->*
A *pa=&a;
(pa->*pmf)(); //调用pa->func()
造函数和析构函数的地址。
要点7、避免产生内存碎片
,它也
是一次只分配一个数组元素的内存。
要点8、是delete还是delete[]
int *p=new int[10];
delete p; //
[]。
要点9、优化成员的排列
struct A
{
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 7 of 8
bool a;
int b;
bool c;
}; //sizeof (A) == 12
在我的电脑上sizeof (A) 等于12
总数是6 1+4+1个字节。那另6
面都插入了3个填充字节以保证每个成员都是按4
struct B
{
bool a;
bool c;
int b;
}; // sizeof (B) == 8
2个字节。因为b占了4
1+1=2 2个字节就刚好
按两个字的形式排列B。
要点10
一个没有虚析构函数的类意味着不能做为一个基类。如std::string, std::
complex, 和 std::vector 都是这样的。为什么继承一个没有虚析构函数的类是
++
class A
{
public:
~A() // 不是虚函数
{
// ...
}
};
class B: public A //错; A没有虚析构函数
06-11-14 下午2:17 C:\Documents and Set...\新建 Probe Document.m 8 of 8
{
public:
~B()
{
// ...
}
};
int main()
{
A * p = new B; //看上去是对的
delete p; //
}
要点11、以友元类声明嵌套的类
不前面。
class A
{
private:
int i;
public:
class B //嵌套类声明在前
{
public:
B(A & a) { a.i=0;};
};
friend class B;//友元类声明
};
声明。
本文档为【C++程序员经常问的11个问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。