C++在语法上大部分都兼容C,但是会在一些方面对C进行加强。有类型的加强,函数的加强等等。
1.namespace命名空间
标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
C中的命名空间 | C++中命名空间 |
---|---|
在C语言中只有一个全局作用域 | 命名空间将全局作用域分成不同的部分 |
所有的全局标识符共享同一个作用域 | 全局作用域也叫默认命名空间 |
标识符之间可能发生冲突 | 不同命名空间中的标识符可以同名而不会发生冲突 |
C++命名空间使用:
命名空间:using namespace name;
使用命名空间的变量:using name::Variable;
#include<iostream>
using namespace std;
namespace NameA
{
int a = 10;
}
namespace NameB
{
int a = 12;
namespace NameC
{
struct Student
{
char name[20];
int age;
};
}
}
void main()
{
using namespace NameA;
cout << "a = " << a << endl;
cout << "a = " << NameB::a << endl;
using NameB::NameC::Student;
NameB::NameC::Student S1;
S1.age = 123;
//S1.name = "abc"; (1)
//strcpy_s(S1.name, "ndwd"); (2)
//S1 = { "wdw",23 }; (3)
cout << "age: " << S1.age << endl;
cout << "name: " << S1.name << endl;
cout<<"hello"<<endl;
system("pause");
}
(1)这样方式是错的,错误类型是不可指定数组类型,不知道为什么…
(2)(3)方式是正确。
当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这样做。std::cout。
2.函数检测增强
C++中所有的变量和函数都必须有类型。C语言中的默认类型在C++中是不合法的。
#include<iostream>
using namespace std;
int getValue(a,b)
{
return 2;
}
int getValue(int a, int b)
{
return 2;
}
void main()
{
getValue(2, 45,23);
cout<<"hello"<<endl;
system("pause");
}
这段代码在C中编译是能通过的,但是在C++中均不通过。
所以在C++中必须要指定类型。
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
3.新增Bool类型
在C++中新增bool类型关键字。
bool flag = true;
4.struct类型增强
struct Student{
char name[20];
int age;
};
int main()
{
Student S1;
s1 = {"name",123};
return;
}
在C++中这样定义和使用时没有错,但是在C中这样是会报错的。要修改成:
struct Student{
char name[20];
int age;
};
int main()
{
struct Student S1;
s1 = {"name",123};
return;
}
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明 。
5.三目运算符增强
#include<iostream>
using namespace std;
void main()
{
int a = 10;
int b = 39;
((a < b) ? a : b) = 50;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout<<"hello"<<endl;
system("pause");
}
这段代码在C++中是可以实现的,但是在C中是错误的。
原因分析:
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用 (a < b ? 1 : b )= 30;
那在C中该如何实现三目运算符为左值呢?
*((a < b)?&a:&b) = 50;
6.const增强
之前也提到过const在C中用法,但是C中的const其实不是真正意义上的const。如:
int main(void)
{
int const a = 10;
int *p = NULL;
p = &a;
*p = 39;
return 0;
}
这样就能把a的值修改了,但是放到C++中,仍然不能被修改。