本片文章介绍c++(c++11标准)的一些入门知识包括
1.命名空间
2.C++输入&输出
3.缺省参数
4.函数重载
5.引用
6.auto关键字(C++11)
7.指针空值—nullptr(C++11)
**
1.命名空间
命名空间的定义和使用
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作 用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字 污染,namespace关键字的出现就是针对这种问题的。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。
普通命名空间的命名和使用,使用作用于限定符来对命名空间的变量使用
namespace N1 // N1为命名空间的名称
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
int main()
{
printf("%d", N1::a);
return 0;
}
此外命名空间还可以嵌套定义例如我再上述N1中嵌套定义一个N2
namespace N1 // N1为命名空间的名称
{
int a = 10;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int b = 20;
int Sub(int x, int y)
{
return x - y;
}
}
}
int main()
{
printf("%d", N1::a);
printf("%d", N1::N2::b);
system("pause");
return 0;
}
在使用命名空间时还可以用using 将变量引入或用using namespace将命名空间引入来使用。
2.c++的输入输出
在c++中使用cin(标准输入)和cout(标准输出)语句进行输入输出,他们都包含在一个iostream头文件中,要使用还用有包含他们的标准命名空间std,输出运算符"<<“和输入运算符”>>"下面来看一个求两个数和的代码。
#include<iostream>
using namespace std;
int main()
{
int a = 0;
int b = 0;
cin >> a >> b;
cout << "a+b=" << a + b << endl;
return 0;
}
3.参数缺省
概念:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该 默认值,否则使用指定的实参。
#include<iostream>
using namespace std;
int Add(int x = 10, int y = 20)//全缺省参数
{
return x + y;
};
int main()
{
cout << Add() << endl;//参数缺省调用
cout << Add(3, 5) << endl;?//不缺省参数调用
return 0;
}
参数缺省还有一种方式半参数缺省
#include<iostream>
using namespace std;
int Sub(int a, int b = 5)//半参数缺省
{
return a - b;
}
int main()
{
cout << Sub(8) << endl;
cout <<Sub(10, 5) << endl;
system("pause");
return 0;
}
在参数缺省时应注意
1.半缺省参数必须从右往左依次来给出,不能间隔着给
2.缺省参数不能在函数声明和定义中同时出现(这是防止便一起去无法识别出错)
4.函数重载
概念:在同一作用域中中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,这就称为重载函数(注意main函数不能重载)
//定义三组函数
Record lookup(const Account&);
Record lookup(const Phone&);
Record lookup(const Name&);
//这三组函数出参数类型外圈不相同,编译器会根据实参的类型确定用哪个函数,同时不允许定义出返回值类型外其他要素相同的函数。
为什么c++支持函数重载那?
编译器在运行程序时会有一个编译的过程,在这个过程中会将函数名和变量的名称进行改编。在c语言中重视将函数名加一个下划线如_Add,但由于C++要支持函数重载,命名空间等,使得其修饰规则比较复杂,不同编译器在底层的实现方式可能都有 差异。
int Add(int left, int right);
double Add(double left, double right);
int main()
{
Add(1, 2);
Add(1.0, 2.0);
return 0;
}
//test.obj : error LNK2019: 无法解析的外部符号 "int __cdecl Add(int,int)" (?Add@@YAHHH@Z),该符号在函数 _main 中被引用
//test.obj : error LNK2019: 无法解析的外部符号 "double __cdecl Add(double,double)" (???Add@@YANNN@Z),该符号在函数 _main 中被引用
这是在编译时报的错误,我们可以看到编译器对函数根据参数类型不同有重新起名字。这就是c++支持函数重载的原因了
5.引用
概念:引用是为变量起了另外一个名字,引用类型引用另外一种类型,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。
须知:引用必须初始化.在定义引用时,引用已经和他的初始值绑定在一起而不是拷贝给引用。这也导致引用一旦引用一个实体就不能再引用其他实体。但是一个实体可以有多个引用,
引用的定义:
int i=1024;
int &r=i;//r是一个int类型法人引用,
int &r=20;//错误引用的初始值必须是一个对象
double b=10;
int &r=b;//引用的数据类型必须相同
用引用做参数
void reset(int &i)
{
i = 0;
}
int main()
{
int j = 20;
reset(j);
cout << j << endl;
system("pause");
}
//再调用函数reset时我们传的时引用这是形参i仅仅是j的有一个名字,此时改变i也就是改变j因此数出0
指针和引用的区别
引用在定义时必须初始化,指针没有要求 2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体 3. 没有NULL引用,但有NULL指针 4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节) 5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 6. 有多级指针,但是没有多级引用 7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理 8. 引用比指针使用起来相对更安
6. auto关键字(C++11)
C++11中auto不再是一个存储类型指示符,而是作为一个新的类型 指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类 型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为 变量实际的类型。
7. 指针空值—nullptr(C++11)
C++11为什 么不在NULL的基础上进行扩展,这是因为NULL以前就是一个宏,而且不同的编译器厂商对于NULL的实现可 能不太相同,而且直接扩展NULL,可能会影响以前旧的程序。因此:为了避免混淆,C++11提供了 nullptr,即:nullptr代表一个指针空值常量。nullptr是有类型的,其类型为nullptr_t,仅仅可以被隐式转 化为指针类型,nullptr_t被定义在头文件中。
注意:
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议好使用nullptr。