C++学习笔记-C++对C语言的扩充和增强

C++兼容C,在C的基础上学习C++是一个不错的选择,也能够更好的了解C与C++的区别与联系。

变量定义

C语言中的变量都必须在作用域开始的位置定义
C++中更强调语言的实用性,所有的变量都可以在需要使用时再定义

int main()
{
	int i = 0;
	printf("test");
	int j;
	system("pause");
	return 0;
}

register

请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率

register说明

是尽可能,不是绝对,怎么处理取决于CPU
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
e.g.(内存拷贝代码)

#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
    register char *d;
    register char *s;
    register int i;
    while (i--)
        *d++ = *s++;
}
#endif

register注意事项

  1. register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数
  2. 因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址
  3. 在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销

C++对register的增强

  1. C语言中无法取得register变量地址,在C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,C++中可以取得register变量的地址
  2. C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
  3. 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充
int main22()
{
	register int a = 0;
	printf("&a = %x
", &a);
	system("pause");
	return 0;
}

函数检测

在C语言中,重复定义多个同名的全局变量是合法的
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

int g_var;
int g_var = 1;

在C++中,不允许定义多个同名的全局变量
C++直接拒绝这种二义性的做法

struct类型

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明,并且在C++中,允许在struct中定义函数。

struct Student
{
    char name[100];
    int age;
};

int main(int argc, char *argv[])
{
    Student s1 = {"wang", 1};
    Student s2 = {"wang2", 2};    
    return 0;
}

C++中所有的变量和函数都必须有类型

C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的
以下源代码在C语言中是合法的,而在C++中则是非法的

f(i)
{
	printf("i = %d
", i);
}

g()
{
	return 5;
}

int main(int argc, char *argv[])
{

	f(10);
	printf("g() = %d
", g(1, 2, 3, 4, 5));
	getchar();	
	return 0;
}

在C语言中:

  1. int f();表示返回值为int,接受任意参数的函数
  2. int f(void);表示返回值为int的无参函数

在C++中
int f()和int f(void)具有相同的意义,都表示返回值为int的无参函数

C++更加强调类型,任意的程序元素都必须显示指明类型

三目运算符

C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用

int main()
{
	int a = 10;
	int b = 20;

	//返回一个最小数 并且给最小数赋值成30
	//三目运算符是一个表达式 ,表达式不可能做左值
	(a < b ? a : b )= 30;
	printf("a = %d, b = %d
", a, b);

	system("pause");
	return 0;
}

其本质可以理解为

*(a < b ? &a : &b ) = 30;

增加了bool类型

C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节
如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false

int main(int argc, char *argv[])
{
	int a;
	bool b = true;

	printf("b = %d, sizeof(b) = %d
", b, sizeof(b));

	b = 4;
	a = b;
	printf("a = %d, b = %d
", a, b);

	b = -4;
	a = b;
	printf("a = %d, b = %d
", a, b);

	a = 10;
	b = a;
	printf("a = %d, b = %d
", a, b);

	b = 0;
	printf("b = %d
", b);

	system("pause");
	return 0;
}
原文地址:https://www.cnblogs.com/cj5785/p/10664750.html