为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C++程序员经常问的11个问题

2011-08-26 8页 pdf 989KB 7阅读

用户头像

is_482472

暂无简介

举报
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++ ...
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++ 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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索