C++对于C故有问题的改进
2020-02-11 16:01:05来源:博客园 阅读 ()
C++对于C故有问题的改进
C++继承了所有的C特性,并且提供了更丰富的语法和特性(OOP支持、模板支持等),并且拥有和C语言同样出色的运行效率。针对C语言的固有问题,C++做出了如下的升级:
- 所有变量都可以在需要使用时再定义(C99支持)
- 忽略register关键字,仍然可以取得register变量的地址
- 不允许定义多个同名的全局变量(C允许这样做,并且这些变量最终会被链接到同一块内存上)
- struct关键字现在可以用来定义一个全新的类型(C只是定义一个标识符,不是一种类型)
- 函数声明中的参数列表为空则表示void(在C中,可以传入任意多的参数)
- 所有的标识符都必须显示声明类型(在C中,默认类型是int)
一、所有变量都可以在需要使用时再定义
在C99标准之前,C函数中的所有变量定义都必须要写在函数的开头:
int main()
{
return 0;
}
void func()
{
int a, b, i;
// 运算代码...
a = 10;
// 运算代码...
b = 20;
// 运算代码...
for(i = 0; i < 10; i++) {
// 运算代码...
}
}
这样做的问题在于:如果函数非常复杂,需要使用的变量很多,那么很难根据上下文来判断变量的含义,对于代码的书写和阅读都很不利。因此,自C99标准开始,C支持在变量需要使用时再定义和初始化:
void func()
{
// 运算代码...
int a = 10;
// 运算代码...
int b = 20;
// 运算代码...
for(int i = 0; i < 10; i++) {
// 运算代码...
}
}
而对于C++,在语言设计之初就已经支持了这个特性。所有的对象都可以在函数中的任意位置定义。
二、忽略register关键字,仍然可以取得register变量的地址
在C语言中,register
关键字用于请求编译器将变量直接定义在寄存器中(编译器可能会根据实际情况忽略这个请求)。然而,这个功能在C++中是一个鸡肋,因此大多数C++不会针对register
关键字进行特殊优化。
int main(int argc, char *argv[])
{
register int a = 0;
int *pa = &a; // C语言不允许这样做,但C++可以。
return 0;
}
三、不允许定义多个同名的全局变量
对于老式的C语言编译器(比如BCC编译器),允许定义同名的全局变量,并且将它们链接到同一块内存上。虽然一些现代化的C编译器(例如gcc, VC)同样不允许这样做,但是这仍然是C的一个黑暗地带。因此,C++完全禁止了这样的做法。现在,C++中的同名的全局变量一定会引发编译错误。
int g_v = 1;
double g_v = 2; // 编译错误: 定义同名的全局变量。
int main(int argc, char *argv[])
{
return 0;
}
四、struct关键字现在可以用来定义一个全新的类型
在C语言中,struct
关键字仅仅用于将多个其他数据类型组合在一起,采取一定的对齐方式占用一块连续的内存空间。然而,它定义的只是一个标识符,无法直接使用这个标识符来定义变量,而必须要使用类型别名的方式来为这个标识符定义类型名称。C++针对struct
做了重要的扩充。现在,struct
被用来定义类类型,不仅直接定义一个新类型,还支持类相关的写法(更多的被用于定义POD
(Plain Old Data)类型)。
struct my_struct
{
int a;
float b;
double c;
};
int main(int argc, char *argv[])
{
// C风格的变量定义。
struct my_struct a;
// C++风格的对象定义。
my_struct c;
return 0;
}
五、函数声明中的参数列表为空则表示void
在C中,函数声明中的参数列表如果为空,则意味着该函数可以接受任意多的实参;而在C++中,这种写法与void等价:
int func()
{
//...
return 0;
}
int main(int argc, char *argv[])
{
func(1, 2, 3, 4/*....*/); // C语言允许这样做,这些变量在函数调用时被压栈。
// C++语言不允许这样做,因为参数列表被推断为void。
return 0;
}
六、所有的标识符都必须显示声明类型
C语言中允许使用函数的默认返回类型和变量的默认类型,然而对此C++有更严格的要求,必须显示地声明变量的类型,或者使用自动类型推断(C++11)。
// C语言允许这样做,默认的返回类型为int。
// C++语言不允许这样做,必须显示地指定返回类型,或者使用自动类型推断。
func()
{
return 5;
}
// C++允许的做法
int func() // 显示指定返回类型
{
return 5;
}
auto func() // 自动推断返回类型(C++11)
{
return 5;
}
decltype(auto) func() // 自动推断返回类型(C++11)
{
return 5;
}
原文链接:https://www.cnblogs.com/rosefinch/p/12294350.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash