C++学习笔记系列一

本文深入探讨了C++中的高级特性,包括命名空间的作用域、const关键字的有效运用、引用与指针的区别、类型强制转换的方法、函数重载的实现原理、默认参数的使用技巧、bool类型的应用场景、内联函数的优化效果以及C++与C语言中字符串处理的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、<<  在c语言里面是左移,在c++里面是一个函数,利用函数重载。例如,
      cout就是一个对象。故它可以调用 << 这个函数。
  • 定义在名称空间中的变量或者函数都称为实体
  •  ::  是作用域限定符 ( std:: cout <<"hello , world ")
  • 在命名空间之后,可以加上提示语句,//end of namespace A;
  • 对于命名空间,除了::,外还可以使用using  命名机制,尽可能将其范围缩小。
  • using 编译指令,(using namespace std ; 实体全部引进)建议不要使用,但可以用using申明机制(using std:: out;)  (推荐使用)
  • 对于全局变量,是位于匿名的命名空间,可以用直接加上双冒号  <<  :  :  num;   就可以了,
  • 对于C头文件里面的所用实体都认为是放在匿名的命名空间里面的
2、名称空间的定义策略
  • 可以把命名空间看成一个容器,
  • 名称空间中函数的定义和实现可以分开进行
  • 函数原型可以多次声明
  • 匿名的命名空间   eg:  ( : :memcpy )
3、const关键字
  • 常量的值是不能被修改的
  • const 常量必须要初始化
  • 预处理仅仅是一个打开头文件,进行一个字符串替换,它是不涉及类型检查的。有可能将错误发生的时机延后到运行时,但,如果使用const关键字,它发生的时机是编译时,是具有类型检查的功能。可以尽量使用const关键字,替换宏定义。const常量必须进行初始化。
  • 对于const常量指针,当用const修饰指针时,(const在* 左边时,eg:  const int * pb),我们是不可以使用指针解引用改变该指针指向内容的值,但是可以修改该指针的指向的。相当于左边加上const后,是保护指针指向的内容的额,叫常量指针。   (经常用)
  • 对于const 如果在* 的右边,是如 int  *  const p;时,此时我们可以改变它指向内容的,但是不可以修改它的指向的,相当于,定义了一个p 的指针常量(经常用),如果不清楚,可以参见prime,以C++ prime为准。从右边向左阅读。
  • 类似的概念还有,指针数组 (eg: int * p[10])和 数组指针int (*p)[10],指针函数( int *p( ) )返回指针的函数和函数指针int (*p)()  。
  • c++的申请堆空间,(  eg: int* p= new int(1)  ),可使用delete 释放空间。首先new/ delete是表达式,其次开辟空间时,是可以进行初始化的,成对使用。申请10个对象时,int *p=new int [10] ( )  ,它是可以识别类型的。这样可以把数组初始化为0,,释放时,delete  [  ] p;都需要加上中括号。
  • 对于c语言的malloc  / free 是c的标准库函数,开辟空间时,是不能初始化的,但可以赋值,给指向,也是必须的。不然就是野指针。成对使用。
4、引用  &
  • 引用是一个变量的别名,有一点和指针很像,因为引用要绑定在一个变量上去的,故必须进行初始化,绑定,一旦绑定就不会再改变指向。(eg:  int  & ref =a)类似于一个指针常量,不能改变指向。
  • 操作引用的时候,就是操作变量本身。经典例子,Swap交换函数,法一,传地址,交换值,法二,传引用,,
  • 非const左值引用不能绑定到右值--->只有const左值引用才能绑定到右值,eg: const  int & ref =10;-->可以。int & ref =10;不行,左值是左边可以加运算符的eg:  &a,,
  • swap(int  & refa,int  &refb)-------swap(a,b)  在参数传递时,可以节省复制的开销,不用另外开辟空间,提高程序的执行效率,使用更直观。
5、指针与引用的差别:
  • 指针是一个独立的实体,而引用是一个别名
  • 指针是不需要进行初始化,但引用必须要进行初始化。
  • 指针是可以改变指向的,引用不能。
  • 指针可以指向NULL,但引用不能。
  • 引用作为函数的参数,操作的就是实参本身。
     引用的注意情况:
  1. 引用作为函数的返回值。首先要保证绑定引用的变量的生命周期一定要大于函数的。例如:在函数栈里面的一个局部变量被引用返回时,局部变量就会被销毁。故注意 不要返回一个局部变量。    
2、  返回一个堆空间的一个引用,return  //  若引用发生偏移,则会
       发生内存泄露,所以,不要将已返回一个堆空间变量的引用的,
       除非已经做好了内存回收的策略的。
6、类型强制转换
  • c语言中,例如,double  b;   int  a=(int ) b;
  • c++中强制转换的运算符,关键字,,
  • int  a,= static_cast<int>(b);
  • 还有const_cast  / dynamic_cast  /  reinterpret_cast(暴力转换)
7、c语言不支持函数重载的,但也可以实现,比较麻烦。
  • c++支持函数重载,其实现的原理当函数名称相同时,是名字改编那么( name mangling),其步骤是,当函数名称相同时,会根据函数的参数的类型,个数,以及顺序的不同进行改编。可先生成 .o文件,再用nm命令查看  .o 文件。
  • 当我们需要函数名以c语言的方式去调用,名字不进行名字改编可以采用关键字   extern  "C"{   里面为语句  }      //end of extern "C"  ,这样就不会进行名字改编。  这样就可以使用C 的方式。
        #ifdef  __cplusplus
         extern  "C"
          {
          #endif
         #ifdef  __cplusplus
         extern  "C"
          {
          #endif
   //这样就可以实现c与c++的混合编程,或者说C++兼容C的代码。
     之所以要这样,是应为C不支持,函数重载。
8、C++是支持函数形参为他一个默认值的(或者缺省值)   int add(int  x,int y=0)        
    
     调用add(3)      //默认--缺省值的设置,只能从右到左的顺序,此
     外,在函数设置默认传参时,要尽量避免二义性。  默认值的问题
9、C++里面提供了一个bool类型
 
        bool大小是一个字节。
10、当有一个简单的函数,直接替换时,c语言可以使用带参数的宏
     定义,C++中可以加上  inline  关键字之后,在函数真正调用
     时,会直接将函数体的内容直接替换,从而提高函数的执行效
     率。 (内联函数)  --- >功能等价C语言的带参数的宏定义。
11、C语言与C++中的字符串
  • c语言在处理字符串时,需要考虑空间大小,避免越界。
  • C++的字符串处理就比较方便,#include<string>  也在std的命名空间里面。std::string s1="hello"; std::string s2(",world");
  • 遍历字符串的内容,string类也可以直接访问, s.size()  或s.length ( )  字符串长度。其中也可以直接用下标访问法去访问。
  • 截取字符串  s. substr(初始位置,截几个)  返回值即为截取的字符串。默认情况下是从0 开始的,
  • 将C++风格的字符串转换成c风格的字符串,,,const char *p= s.c_str( ) ;常用  或者  S.data( )方法也可以完成这样的工作。
  • “hello”  的类型就是const  char  * 的类型。故这就是反转换成C++的string  的类。(常用 )    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smilejiasmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值