设为首页 加入收藏

TOP

c++ primer总结小点(四)
2013-12-05 13:05:09 来源: 作者: 【 】 浏览:609
Tags:  primer 总结 小点

 

  13、在delete指针前对指针进行测试是没有必要的,例如:

  [cpp]

  在CODE上查看代码片派生到我的代码片

  if(pi!=0)

  delete pi;

  //完全没有必要

  但是在delete后,一定要将pi = 0.

  14、定位new表达式:将对象创建在已经被分配好的内存中。形式:

  new (place_address) type -specifier

  使用这种new表达式,必须包含头文件<new>,这项设施允许程序员预分配大量的内存,供以后通过这种形式的new创建对象。例如:

  [cpp]

  在CODE上查看代码片派生到我的代码片

  #include <iostream>

  #include <new>

  const int chunk = 16;

  class Foo{

  public:

  Foo(){_val = 0;}

  int val(){return _val;}

  private:

  int _val;

  };

  //预分配内存,但没有Foo对象

  char *buf = new char[sizeof(Foo) * chunk];

  int main()

  {

  //在buf中创建一个对象Foo

  Foo *pb = new (buf) Foo;

  //检查对象是否被放在buf中

  if(pb->val() == 0){

  cout 《 "new expression worded!" 《 endl;

  }

  //到这里不能使用pb

  delete [] buf;

  return 0;

  }

  //执行程序输出:new expression worded!

  //注意两点:1、new出来的pb不用delete;2、delete buf时注意是[];

  [cpp]

  在CODE上查看代码片派生到我的代码片

  int globalObj;

  char buf2[1000];

  void f(){

  int *pi = &globalObj;

  double *pd = 0;

  float *pf = new float(0);

  int *pa = new (buf2) int;

  delete pi;//崩溃

  delete pd;//ok,pd=0可以delete,如果声明为double *pd;delete时报错

  delete pf;//ok

  delete [] pa;//崩溃

  }

  [cpp]

  在CODE上查看代码片派生到我的代码片

  typedef int arr ;//定义一种类型,其包含10个整形的数组;

  int *pa = new arr;

  delete [] pa;//正确删除方法

  15、待研究:auto_ptr、常量对象的动态分配与释放;

  16、有时间回头看看第6章(抽象容器类型,尤其是他的操作文本的例子);12章泛型算法回头看看;

  17、类中的非const成员变量不能在类体中显式的初始化;例如:

  [cpp]

  在CODE上查看代码片派生到我的代码片

  class FC{

  public:

  static int si = 9;//错误

  const int si0 = 7;//正确

  const static int si1 = 8;//正确

  int *pi = 0;//错误

  double d = 0.0;//错误

  };

  18、友元(friend):允许一个类授权被声明为友元(friend)的函数(类)实现中访问本类的非公有成员;例如:

  友元函数:

  [cpp]

  在CODE上查看代码片派生到我的代码片

  class Foo{

  friend int fu(Foo & fv);

  public:

  Foo():_value(15){}

  private:

  int _value;

  };

  int fu(Foo &fv)

  {

  return fv._value;

  }

  int main(void)

  {

  Foo *foo = new Foo();

  cout 《 fu(*foo);

  }

  友元类:Query是NameQuery的基类

  [cpp]

  在CODE上查看代码片派生到我的代码片

  class Query{

  freiend class NameQuery;

  public:

  //…

  }

  现在NameQuery不但可以访问它自己的基类(Query)子对象的私有成员,而且还可以访问所有Query对象的私有和被保护的成员。

  19、每个类对象都有自己的类数据成员拷贝,但是,每个类成员函数的拷贝只有一份。

  20、在类体中定义的函数被自动作为inline函数处理。

  21、把一个成员函数声明为const可以保证这个成员函数不能修改类的数据成员,但是如果该类含有指针,那么在const成员函数中能修改指针所指向的对象。例如:

  [cpp]

  在CODE上查看代码片派生到我的代码片

  #include <cstring>

  using namespace std;

  class Text{

  public:

  void bad(const string &parm) const;

  private:

  char *_text;

  };

  void Text::bad(const string &parm) const

  {

  _text = parm.c_str();//错误,不能修改_text

  for(int ix = 0; ix < parm.size(); ix++){

  _text[ix] = parm[ix];//不好的风格,但是不是错误的

  }

  }

        

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于超级源点和超级汇点问题 下一篇c++中*& 和**& 符合作..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)