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,但引用不能。
- 引用作为函数的参数,操作的就是实参本身。
引用的注意情况:
- 引用作为函数的返回值。首先要保证绑定引用的变量的生命周期一定要大于函数的。例如:在函数栈里面的一个局部变量被引用返回时,局部变量就会被销毁。故注意 不要返回一个局部变量。
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 的类。(常用 )
阅读全文
0 0
- C Primer Plus 学习笔记系列之(一)
- 《C Primer Plus》 学习笔记系列之(一)
- [JNI]学习笔记系列:一
- JNI 学习笔记系列(一)
- C++学习笔记系列一
- 机器学习系列笔记(一)
- c学习笔记(一)
- 【C++】学习笔记一
- C语言系列学习笔记
- C语言笔记系列(一)--概述
- C#的学习笔记(一)
- Linux c 学习笔记(一)
- 学习《c++primer》笔记一
- c语言学习笔记一
- c 学习笔记 (一)
- C语言学习笔记一
- 《C++Primer》 学习笔记一
- C/C++学习笔记(一)
- CodeForces
- NYOJ16 矩形嵌套 (最长递增子序列)
- 河南省多校连萌(四)
- JS面试题及答案
- 多线程与死锁
- C++学习笔记系列一
- Java线程八锁
- Hibernate的count(*)函数通过调用uniqueResult方法的返回值类型
- noip2013day1
- Android中使用数据库保存数据
- Redis--persistence(持久化)
- hdu6154
- iOS 数据结构~链表简介
- 笔记:堆的增删改查(数组实现)