C++简单入门总结

一、C++关键字:c语言中共有37个关键字,c++中共有63个关键字。
二、命名空间:使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,其中一个命名空间就定义了一个新的作用域。特点:
1、其中namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}即为命名空间的成员。普通定义
2、命名空间可以嵌套及一个函数可以出现在两个不同的命名空间内。
3、同一个工程中允许存在多个相同名称的命名空间,其编译器会合成到同一个命名空间中。命名空间可以合并
三、缺省参数
1、全缺省参数

void Test(int a=10,int b=20,int c=30)
{
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
}
//使用函数调用时,不管调用的函数有没有传参都可以,如果传参及不能超过其规定的参数数。

2、半缺省参数

void Test(int a , int b = 20, int c = 30)
{
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
}
//使用函数调用时,其缺几个参数其至少就传几个参数。

1、半缺省参数必须从右向左依次来给,不能间隔着给。
2、缺省参数不能在函数声明和定义中同时出现
四、函数重载:c++中允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或参数类型或参数顺序)必须不同。返回值不能作为函数重载的标记。
c/c++中,一个程序要运行起来,要经历的编译过程:
1.预处理:去注释,宏替换,头文件展开。a.cpp–>a.i
2.编译:语法检查,转换成汇编代码。a.i–>a.s
3.汇编:将汇编代码转化成机器码。a.s–>a.obj
4.链接:生成可执行程序。将多个obj文件链接在一起生成一个可执行文件。
c 语言不能进行函数重载,因为c语言只是简单的在函数名前添加下划线,因此 编译时会出现相同函数名的函数。c++可以进行函数重载,函数名添加:前缀+函数名+参数,保证名字在底层的全局唯一性。linux是 _Z+函数名+参数
c++工程可以将某些函数按照c的风格来编译,在整个函数前加extern “c” ,意思告诉编译器,将函数按照c语言的规则来编译。
五、引用:定义引用不是新定义一个变量,而是给已存在变量取了一个别名
类型& 引用变量名(对象名)=引用实体,引用类型必须和引用实体是同种类型的。

int a=10;
int& ra;//编译时出错
int& ra=a;
int& rra=a;
//输出地址全部相同,都是指向a的实体地址。

特征:1,引用在定义时必须初始化。2,一个变量可以有多个引用。3,引用一旦引用一个实体,再不能引用其他实体。4、引用做返回值的时候,返回值的生命周期必须不受函数的限制(即比函数生命周期长)
传值,传引用效率比较:以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
引用和指针的不同点
1、引用在定义时必须初始化,指针没有要求
2、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
3、没有NULL引用,但有NULL指针
4、在sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
5、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6、有多级指针,但没有多级引用
7、访问实体方式不同,指针需要显示解引用,引用编译器自己处理
8、引用比指针使用起来相对安全

六、内联函数:以inline修饰的函数叫内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率
特性:1,inline是一种以空间换时间的做法,省去调用函数额开销。所有代码很长或者有循环/递归的函数不适宜用作为内联函数。2,inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。3,inline不支持分离编译,声明和定义放在一起,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
宏定义优点:1,增强代码的复用性。2,提高性能。
缺点:1,不方便调试宏(因为预编译阶段进行了替换)2,导致代码可读性差,可维护性差,容易误用。3,没有类型安全的检查。
C++中哪些技术代替宏:1,常联定义换用const 2,函数定义 换用内联函数
七、auto关键字:使用auto修饰的变量,是具有自动存储器的局部变量。auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。auto类型的占位符,根据你给出的数值,其自动推导出。
1、使用anto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的时间类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto a=1,b=2;
auto c=3,d=4.0;

2、当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后出来的类型定义其他变量。
3、auto不能作为函数的参数,auto不能直接用来声明数组。不能定义类的非静态成员变量,不能作为模板的参数
八、基于范围的for循环:for循环后的括号由冒号“:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

int array[]={1,3,5,7,9};
for(auto& e:array)
cout<<e<<" ";

与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
九、指针空值nullptr
NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。
字面常量0即可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。
nullptr代表一个指针空值常量。nullptr是有类型的,其类型为nullptr_t。sizeof(nullptr)与
sizeof((void*)0)所占的字节数相同。

猜你喜欢

转载自blog.csdn.net/weixin_43198968/article/details/88298846