我的C++学习笔记我C++学习笔记.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
我的C学习笔记我C学习笔记

结构体struct 和类class可以互换,本质结构体是一种特殊的类,struct默认是public 而class默认是private Cons int a; 常量是要进行初始的。:a(1); 引用必须在定义的时候初始化。 全局变量或者全局对象,在进入main函数之前就已经分配好了内存空间 当基类的构造函数是为缺省的值时,在派生子类实例化时基类构造可以不带参数。 ::Showwindow() 这样的前面加两个冒号,表示调用的是全局函数,即平台sdk的函数。 用const结尾的成员函数只能调用其他const结尾的成员函数。因为其他函数并不能保证同样不修改类的成员变量 ? 成员函数后加const,表示:类作者提示你,这个函数不会导致对象状态改变 ? ? 可以理解为"表示这个函数不会修改任何成员变量" ? ? 但不可绝对化。其实,还是可以修改由mutable关键字修饰的成员变量的。C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A(7);); 显示调用析构函数的语法: a.A::~A();(可以写成a.~A();) .? 显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象;? 如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存. 当用创建好的对象显示调用构造函数时, 对象指向的动态内存更新显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了.? 如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误.析构函数和内存释放,有一篇的总结,因为内容长,以后贴上来 先看个简易的 class A { public: ??? A(int i = 3){a = i;}; ??? ~A(){cout << "destructor" << endl;} ??? int value(){return a;} private: ??? int a; }; int main() { ??? A a; ??? A *p = new(&a) A(10); ??? cout << a.value() << endl; ??? delete p; ??? return 0; } 在a对象的地址上未析构a的时候,创建了新的无名堆对象,这样a的数据被覆盖了, 但是编译器并未收到析构函数调用的消息,所以它认为那块内存存放的仍然是a对象的数据,所以a.value()仍可以取回值,取回当时内存中那个地址处的值,这是已经是10了。 然后delete p的时候,执行两步工作, 1。无名对象的析构函数调用,告诉编译器,那块内存中的值不能解释成无名对象的数据了,对于无名对象而言,已经无效了(但对于a对象而言,因为编译器并未收到a对象析构函数的调用,所以认为那块内存中的数据对于a而言仍是有效的,是a的数据的) 2。问题发生在这个时候,delete p的第二个动作,归还内存给系统,标识为空闲内存(没有任何对象引用到的,没有任何函数占用的内存),而事实上,这是对于p所指对象而言,对于a对象,它仍引用到这块内存,这样产生了异常,系统认为是快空闲内存了,但确有个对象引用到了这块内存,行为属未定义。 ????? 这就好像两个指针指向同一块的内存,一个把内存释放了,另一个指针成了悬垂指针,对悬垂指针解引用取出的值无意义,随机的,看当时内存中的数据 简单的说, ??? 构造函数就是通知编译器,这块内存的数据解释成一个对象,哪块是哪个数据成员的数据,这些信息是构造函数给编译器的,都是隐式给的;显式的动作可以放在构造函数中(并未必需的)的,是初始化(不给初始化值可以的,随机值),获取资源 ??? 析构函数就是通知编译器,这块内存中的数据以后无需维护了,可以让其它使用了,里面的数据再不能解释成类对象的数据了,析构函数调用之后可以两种选择 ??? 1。一般情况,归还内存,栈的,堆的,都是 ??? 2。保留内存,只析构对象,这常见于placement new,delete往往同时执行了两个动作,所以这是候并不能直接delete,而是显式调用析构函数(详细论述待以后的总结)/todototry/article/details/1477210 int *pia = new int[10]; 我们并不能给动态分配的数组每个元素一个初始化值,语法并不支持 基于这个原因,对于对象数组 如果并没有默认构造函数,不能创建动态对象数组,因为new对象数组的时候,自动

您可能关注的文档

文档评论(0)

ganqludp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档