C++学习笔记(一):C到C++的升级
0x01 C与C++的关系
- C++继承了所有C的特性
- C++在C的基础上提供了更多的语法和特性
- C++的设计目标是运行效率与开发效率的统一
C++ 以C语言为基础,增加了对面向对象的支持,并做了类型加强、函数加强、异常处理等优化。
0x02 C到C++的升级
-
C++更强调语言的实用性
-
所有的变量都可以在需要使用时再定义(在C语言中的变量都必须在作用域开始的位置定义)
-
C++中依然支持register关键字,但是C++编译器有自己的优化方式
- C语言中无法获取register变量的地址
- C++中可以取得register变量的地址
- C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
-
C++中不允许定义多个同名的全局变量(C中重复定义多个同名的全局变量是合法的,这些同名的全局变量最终会被链接到全局数据区的同一个地址空间)
-
struct关键字的加强
- C语言中的struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
-
C++中所有的标识符都必须显示的声明类型(C语言中的默认类型在C++中是不合法的)
0x03 实例分析一
对上述的C到C++升级的特性(1、2、3、4),用代码的方式直观的来感受
#include <stdio.h>
int g_v;
int g_v;
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = 0;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
c += i * j;
}
}
printf("c = %d\n", c);
register int a = 0;
printf("&a = %p\n", &a);
printf("End...\n");
return 0;
}
上面贴出的代码用来感受C++的以下三个特性:
-
所有的变量都可以在需要使用时再定义
for(int i=1; i<=3; i++) { for(int j=1; j<=3; j++) { c += i * j; } }
-
C++中可以取得register变量的地址
register int a = 0; printf("&a = %p\n", &a);
-
C++中不允许定义多个同名的全局变量
#include <stdio.h> int g_v; int g_v;
编译运行结果
- C语言编译运行结果:
- C++ 编译运行结果:
实例分析二
对上述的C到C++升级的特性(5、6),用代码的方式直观的来感受
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 30};
Student s2 = {"Tang", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
上面贴出的代码用来感受C++的以下两个特性:
- struct关键字的加强
- C语言中的struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
C和C++中结构体的等价定义如下:
//C语言定义如下:
typedef struct _tag_student Student;
struct _tag_student
{
const char* name;
int age;
};
//C++定义如下:
struct Student
{
const char* name;
int age;
}
-
C++中所有的标识符都必须显示的声明类型
- 在C语言中:
- int f()表示返回值为int,接受任意参数的函数
- f(void)表示返回值为int的无参数函数
- 在C++中:
- int f()与int f(void)具有相同的意义:表示返回值为int的无参函数
- 在C语言中:
0x04 一道面试题的回答
int f()与int f(void)有区别吗?
有区别,也没有区别,有没有区别要看是在C语言中使用还是在C++中使用,如果在C中,那就是有区别,在C++中那就没有区别了,因为在C++中所有的标识符都必须显示的声明类型,不允许二义性存在,这是对C的一个升级,因为在C中参数为空时,可以接收任意多个参数。
~欢迎各位师傅关注我的公众号哟~