赞
踩
版本 | 更新内容 |
---|---|
C++98 | C++第一个版本,绝大多数编译器都支持,以模板方式重写C++标准库,引入STL (标准模板库) |
C++03 | C++标准第二个版本,语言特征无大改变,主要:修订错误,减少多异性 |
C++05 | C++保准委员会发布了一份计数报告 |
C++11 | 增加了许多特性,使得C++更像是一种 新语言,例如:正则表达式,基于范围for循环,auto关键字,新容器,列表初始化,二进制字面常量等 |
C++14 | 对C++的扩展,主要是修复C++11中漏洞以及改进 |
C++17 | 在C++11上做了一些小幅改进,增加了19个新特性 |
C++20 | 制定ing |
C++总计63个关键字,C语言32个关键字
asm | do | if | return | try | continue |
---|---|---|---|---|---|
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或者名字污染,namespace关键字就是解决这个问题的。
1.普通的命名空间,命名空间中的内容,既可以定义变量,也可以定义函数
2.命名空间可以嵌套
3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
4.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
namespace N { int a; int b; int Add(int left, int right) { return left + right; } namespace N1 { int c; int d; int Sub(int left, int right) { return left - right; } } }
三种方法:
1.加命名空间名称及作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
2.使用using将命名空间中成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
3.使用using namespace命名空间名称引入
using N::b;
using namespace N;
using namespace N1;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int a;
cin >> a;
cout << a << endl;
cout << "Hello World" << endl;
return 0;
}
当函数声明或者定义函数的时候,我们可以给函数的参数一个默认值,当函数调用的时候,如果没有指定该函数的参数,那么函数调用默认使用默认参数。缺省参数分类:全缺省参数和半缺省参数。
注意:
1.半缺省参数必须从右往左依次来给出,不能间隔
2.缺省参数不能在声明和定义中同时出现,因此声明和定义最好不要分开写
3.缺省的值必须是常量或者全局变量
4.C语言不支持
int fun(int a = 10, int b = 20)
{
return a + b;
}
int main()
{
cout << fun() << endl;
cout << fun(1,2) << endl;
return 0;
}
C++中允许在同一个作用域中声明几个功能类似的同名函数,同名函数的形参列表是不同的(参数个数或者类型或者顺序不同)
int fun(int a = 10, int b = 20)
{
return a + b;
}
double fun(double a, double b)
{
return a + b;
}
double fun(int a, double b)
{
return a + b;
}
下面这个不属于函数重载
short Add(short left, short right)
{
return left + right;
}
int Add(short left, short right)
{
return left + right;
}
面试题:
为啥什么上面这个两个函数不能函数重载?为什么C++支持函数重载,而C语言不支持函数重载?
在C/C++中,一个程序要运行起来需要预处理,编译,汇编,链接。在C语言中函数最后会转化成为_fun,而在C++中,函数会根据参数的多少,顺序,类型的不同来产生不同的函数名,因此是可以根据这些信息对同名函数进行区分。然而在linux下,采用gcc编译完成后,函数名称的修饰没有发生改变。
函数签名 | 修饰后名称 |
---|---|
int func(int) | ?fun@@YAHH@Z |
float func(float) | ?fun@@YAMM@Z |
int C::func(int) | ?fun@C@@AAEHH@Z |
int C::C2::func(int) | ?fun@C2@C@@AAEHH@Z |
int N::func(int) | ?func@N@@YAHH@Z |
int N::C::func(int) | ?func@C@N@@AAEHH@Z |
在C++工程中某些函数可能需要按照C的风格来编译,同过关键字extern,意思告诉编译器该函数按照C语言规则来编译
extern short Add(short left, short right)
{
return left + right;
}
面试题:
下面两个函数能形成函数重载吗?会出现什么问题?
void TestFunc(int a = 10)
{
cout << "void TestFunc(int)" << endl;
}
void TestFunc(int a)
{
cout << "void TestFunc(int)" << endl;
}
不能,默认值不同但是函数在进行编译链接的时候函数的名字是一样的,计算机会不知道调用哪个,存在二义性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。