C++学习笔记系列一

来源:互联网 发布:淘宝皮草款式 编辑:程序博客网 时间:2024/06/03 20:35
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  的类。(常用 )   
原创粉丝点击