C++要点摘录(一)C到C++的升级
来源:互联网 发布:理财软件下载 编辑:程序博客网 时间:2024/05/29 04:29
一.C到C++的升级
1. C++支持所有的变量都可以在使用时再定义,c语言中的变量都必须在作用域开始的位置定义(c99标准已经支持)
注: c语言支持作用域首部定义,作用域指{}区域,不一定是函数首部。例如:for循环中,在for的作用域中定义的变量,在作用域结束的时候就释放了
#include<stdio.h>void main(){int i,c,j; for(i=0; i<10; i++) { int k=0; for(j=0; j<10; j++) { c += i * j; }printf("%d\n",k);k++; }k++;}会报错
2.register关键字的变化
C: C语言中无法取得register变量的地址
C++:C++编译器依然支持register关键字,但是C++编译器有自己的优化方式,不使用register也可能做优化
C++中可以取得register变量的地址。C++编译器发现程序中需要register变量的地址时,register对变量的声明变得无 效。
早期c语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
3.C++不允许定义多个同名全局变量
在C语言中,重复定义多个同名的全局变量是合法的。这些同名的全局变量最终会被连接到全局数据区的同一个地址空间
在C++中,不允许定义多个同名的全局变量
4. C++编译器对const常量的处理
1. 当遇见常量声明时在符号表中放入常量
2.编译过程中若发现使用常量则直接以符号表中的值替换
3.编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间
注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
区别:C------const变量是只读变量,有自己的存储空间
C++------可能分配存储空间(为了兼容C语言,只是能取地址)的情况:当const常量为全局,并且需要在其他文件中使用;当使用&操作符取const常量地址
4.c++中的const常量类似于宏定义 const int c =5;约等于#deine c 5
c++与宏定义不同:1.const常量是由编译器处理的,提供类型检查和作用域检查;2.宏定义由预处理器处理,单纯的文本替换
在C语言中将const指针赋值给普通指针会有警告,但是在C++中会报错,在C++中非const指针不可以接受const指针,是防止你通过非const指针去改变他所指向的值(如果要赋值,请强制转换)
5.struct类型的加强
C语言的struct定义了一组变量的集合,c编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明,下面的代码c语言报错,c++能够编译通过,因为c语言编译器不认识Student类型,要用struct Student来标识
#include <stdio.h>struct Student{ const char* name; int age;};int main(int argc, char *argv[]){ Student s1 = {"Delphi", 30};//c语言应改为struct Student Student s2 = {"Tang", 30}; printf("Press enter to continue ..."); getchar(); return 0;}
C++中的struct扩充了C的struct功能,在C++中struct≈class,能够包含构造函数和成员函数,C++中struct和class的区别在于class默认成员属性是private,struct中默认成员属性是public;class可以用于表示模板类,struct不行。
C中的struct只是复杂数据类型集合,调用函数需要使用函数指针来实现
6.类型的加强
c++中所有的变量和函数都必须有类型,必须写明,没有默认一说。
c语言中的默认类型在c++中是不合法的
#include <stdio.h>f(i){ printf("i = %d\n", i);}g(){ return 5;}int main(int argc, char *argv[]){ printf("Begin...\n"); f(10); printf("g() = %d\n", g(1,2,3,4,5)); printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0;}c语言编译器正常编译运行,打印i=10, g()=5,因为c语言函数的默认返回值是int,参数默认类型也是int
f(i) ===>int f(int i)/////g()====>int g(),g()可以接受不限制的参数g(1,2,3……)都是c的缺陷,所以不接收参数要写明void,int g(void)
c++编译器报错,没有返回值类型,c下面的函数很随意
int f()和int f(void)的区别
C语言中:int f()表示返回值为int,接受任意参数的函数;int f(void)表示返回值为int的无参函数
C++中:int f()和int f (void)具有相同的意义,都表示返回值为int的无参函数
小结: C++更强调实用性,可以在任意的地方声明变量
C++中register只是一个向后兼容的作用,C++编译器自己能够进行更好的变量优化,而不需要指明
C++中的const是一个真正意义上的变量,而不是只读变量
C++更强调类型,任意的程序元素都必须显示指明类型
7.C++中的布尔类型
C++在C语言的基本类型之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0) 两个值:C++编译器会在赋值时将非0值转换为true(1),0值转换为false(0)
#include <stdio.h>int main(int argc, char *argv[]){ int a; bool b = true; printf("b = %d, sizeof(b) = %d\n", b, sizeof(b)); b = 3; a = b; printf("a = %d, b = %d\n", a, b); b = -5; a = b; printf("a = %d, b = %d\n", a, b); a = 10; b = a; printf("a = %d, b = %d\n", a, b); b = 0; printf("b = %d\n", b); printf("Press enter to continue ..."); getchar(); return 0;}
非零值赋值给bool变量,会转换为1;将bool型变量赋值给其他变量,只能获得1或0两种结果
8.三目运算符的升级
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可能出现在程序的任意地方
注意: 三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
#include <stdio.h>int main(int argc, char *argv[]){ int a = 1; int b = 2; (a < b ? a : b) = 3; printf("a = %d, b = %d\n", a, b); printf("Press enter to continue ..."); getchar(); return 0;}
- C++要点摘录(一)C到C++的升级
- 《Effective C++》要点摘录
- 《Effective C++》要点摘录
- 一、c到c++的升级
- c语言要点摘录(29~32 内存管理的艺术)
- 《Effective C++》经典语句、要点摘录
- C语言要点摘录(1~5)
- C语言要点摘录(6~10)
- C语言要点摘录(11~14)
- c语言要点摘录(15~20)
- c语言要点摘录(33~36 函数)
- C到C++的升级
- c到c++的升级
- c到c++的升级
- C到C++的升级
- C到C++的升级
- C到C++的升级
- C到C++的升级
- struct 定义函数体 竟然可以!
- 一点一点重学统计学(一)——平均数与方差
- windows环境DLL链接问题之三:C/C++修饰符问题续
- 使用PDFlib生成pdf
- HDU 2054 A==B?,NYOJ-524-A-B(很有意思)
- C++要点摘录(一)C到C++的升级
- #ifndef /#define/#endif
- 极客技术专题【010期】:jQuery初学者入门 - jQuery effects
- java.lang.IllegalStateException: Invalid shuffle port number -1 returned for attempt_1377744323071_0
- myeclipse搭建webservice实例讲解
- 图片双缓存异步加载,把内存处理做到最优
- POJ 3686 最小权匹配
- 新人域名投资五部曲
- HDU--1564 -- play a game [博弈]