c++ 随笔记录 持续记录

1、->和 .实现的功能是一样的,都是访问类的成员变量或成员函数,. 用于普通变量操作,->只能用于指针变量操作。如:若a为一指向对象的指针,a->f(s)就表示调用a所指的对象中的成员函数f(s)

2、功能简短的函数使用inline  减少编译的时间和复杂度,使用上和普通函数没有区别,只是在函数声明和实现前加上inline 关键字即可

3、assert,if else ,try catch,用于异常处理

3.1 assert 使用方式:

        1 #include "assert.h" 
        2 void assert( int expression );

asser内的语句判断为真才进行后面的代码运行,如果判断为false,后面的程序不在运行,直接报错,跳出程序块。相较于if else  代码长度比较短。

用法总结与注意事项: 

  1)在函数开始处检验传入参数的合法性 
  如: 

 1 int resetBufferSize(int nNewSize) 
 2 { 
 3 //功能:改变缓冲区大小, 
 4 //参数:nNewSize 缓冲区新长度 
 5 //返回值:缓冲区当前长度 
 6 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
 7 assert(nNewSize >= 0); 
 8 assert(nNewSize <= MAX_BUFFER_SIZE); 
 9  
10 ... 
11 } 

 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 
   
  不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);   
  好:  assert(nOffset >= 0); 
      assert(nOffset+nSize <= m_nInfomationSize); 
  
  3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 
  错误: assert(i++ < 100) 
     这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。 
  正确: assert(i < 100) 
      i++; 
  
  4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感 
   
  5)有的地方,assert不能代替条件过滤    
   
  程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。 

以下是使用断言的几个原则: 
   
  (1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 
   
  (2)使用断言对函数的参数进行确认。 
   
  (3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。 
   
  (4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。 
  
  ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。  

===========================

this指针,操作符重载

1、堆区开辟的内存空间赋值给变量是指针类型(指针指向开辟的内存地址)
2、c++ operate解决拷贝构造函数默认为浅拷贝的问题(指向同一个内存)
使用operate 重构=运算符,实现深拷贝,开辟新的内存空间。当变量调用
析构函数释放内存时不会存在冲突。(赋值操作运算符重载operator=)
3、c++ this指针
 //1、形参和成员变量重名时,this指代对象本身,帮助识别变量还是形参
 // 2、返回对象本身,this是实例对象的指针

=======================

智能指针的使用和c++编译器工作的内容,涉及编译,链接。

编译阶段的预处理,和编译后输出的文件如何设置和查看

一、智能指针的使用
1、std::unique_ptr 可以实现自动管理内存,当指针对象出了作用域之后会自动释放内存,
不可以对该指针进行复制
使用方式为:std::unique_ptr<type> uptr = std::make_unique<type>(Size)
2、std::shared_ptr 使用共享指针时系统自动进行计数也可以实现内存自动管理,当指针使用计数为0时,该指针对应的内存会自动释放
使用方式为: std::shared_ptr<type> sptr = std::make_shared<type>(size)
3、std::weak_ptr  与std::share_ptr一起使用,不会增加共享指针的计数,当共享指针被释放时
虚指针会变成空指针。
使用方式为:std::weak_ptr<type>wptr     wptr = sptr  Observe(wptr)

二  c++编译器工作内容 编译,链接
c++ 编译和链接相关内容的学习:c++项目编写的cpp和.h文件经过编译变成cpu可识别的二进制.obj文件
通过链接构成可执行文件。vs中error是将output中的erro关键词进行识别并将相关内容显示在error页面。
错误类型C提示为编译阶段的错误,link为链接阶段的错误。
c++编译前会先对预处理语句进行处理,包括include,define, if ifdef,pragma
define的功能为替换例如将 aaa替换为int  #define aaa int,#include 是将导入的文件的内容直接复制到cpp文件中

三、编译后输出的文件类型更改的设置方法
1、将编译后生成的二进制文件更改为汇编语言文件 obj->ams
构建的项目-属性-c++子目录下outfiles把汇编程序设置为Assembly-only listing
项目输出目录下编译之后生成的obj文件将会变成.AMS文件生成cpu将要执行的汇编指令文件
2、编译后输出可以看到预处理之后生成的代码文件(.i文件)
构建的项目-属性-c++-预处理(Preprocessor)-processor to file 设置为yes 项目输出目录(debug)
中编译后生成.i文件,可以看到预处理后的c++ 代码  文本编辑器打开可以看到预处理后生成的代码

3、通过查看汇编语言可以进行代码优化,vs中有编译优化可以设置,减少不必要的汇编指令。

构建的项目-属性-c++-优化(Optimization)--Optimization 选择想要的优化程度

【6】【Cherno C++】【中字】C++编译器是如何工作的_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值