有关优化的部分,咱们对比一下两组代码分别是 C语言和C++的写法。c++
//.C----------- int a; int a = 10;//能够编译 //.cpp---------- int a; int a = 10;//报错,重复编译
//.c------------------- int a(b,c) {} void test() { a(0,100,10);//仍然能够经过编译 } //.cpp------------------- int a(b,c) {} //没有~~~~参数类型和没有返回值 void test() { a(0,100,10);//报错! //参数个数不匹配 }
//.c------------------ char * p = malloc(sizeof(64));//malloc返回void*类型,进行转换。能够编译 //.cpp---------------- char * p = malloc(sizeof(64));//没法编译。char*不等于void*。须要手动强制类型转换(char*)
//.c-------------------- struct A { int a; char c; }; void test() { struct A a;//须要加struct } //.cpp------------------- struct A { int a; char c; }; void test() { struct A a;//能够步加struct //同时C++的结构体中能够有函数 }
在这里能够引入有关面向对象的一些思想。(若是以前学过Java,会更好理解一下的描述)
C语言中结构体中不能放函数。而函数(function)其实就是实现某一种功能。
C++中结构体中能够放入函数。其实能够这样理解:一个事物(不管是什么东西,吃的喝的用的,活的死的等等)都有本身的参数或者本身的方法(二者至少有其一)咱们能够在许许多多的事物中的找到他们的共同点(或许是共同的参数,或者是相似的功能).把这些相同点,都放入C++的结构体中,这就是一个"类"。这里C++就引入面向对象的思想。
[注]:C语言之因此不是面向过程,这正是由于C语言把参数和功能分开存放。(这里涉及到面向对象的一个特性--封装)用OOP的话来讲,就是没有把成员变量(Java:属性)和成员函数(Java:方法)封装到一块儿。因此C++中结构体实际上是特殊的类。数组
//.c---------------------------------- int a = 1; int b = 2; printf("结果:" ,a > b ? a : b );//输出结果是2 a > b ? a : b = 3;//此时编译器就会报错,由于这一条语句至关与 2 = 3 //若是咱们但愿上述语句能成立,咱们应该这样改写: *(a > b ? &a : &b) = 3; //但此时,奇怪的事情发生了。当咱们用printf输出a,b的时候发现b的值被改变了。 //.cpp---------------------------------- int a = 10; int b = 20; cout << "结果是: "<< (a > b ? a : b) << endl;//能够编译,结果是20 (a > b ? a : b) = 100;//能够经过,c++ 中返回的是变量 cout<<"a = "<<a<<endl;//a = 10 cout<<"b = "<<b<<endl;//b = 100
//.c------------------------------------ const int m = 10;//没法修改 void test() { const int n = 20; int * p = (int *)&n; *p = 200; printf("*p = %d n = %d",*p,n); //*p = 200 n = 200 //咱们已经把n修改了。这实际上应该是不被容许的,不给const面子。 } //.cpp---------------------------------- const int n = 20;//不容许修改,伪常量: int arr[n]不能初始化数组! //若是要修改: int *p = (int*)&n; *p = 200; printf("*p = %d,n = %d ",*p,n); //*p = 200,n = 20 //*p 确实改了,但n没有改
在C语言中,const int n = 2; 实际上是给n分配了空间的,只要分配了空间,咱们就能够用&找到地址,用指针修改。
在C++中,const int n = 2;没有分配空间,而是把n放到一个表(key-value表)里面。用n的时候直接查表。函数
int p = (int)&n;*p = 200;这里的修改了哪里的地址呢?
编译器开辟了一个临时的空间,至关于int temp = n;int p = (int )&temp; *p指向了临时空间。优化
可是C++ const不分配内存并非绝对的,有如下几种状况会分配内存:设计
int a = 10;
const int b = a;
咱们能够用上述方法来修改内存。指针
补充:
尽可能用const代替#define#define MAX 1024;
define 是在预处理过程当中,对MAX进行了替换。换句话讲,编译器根本不认识MAX,即编译器压根不知道有MAX这一回事。因此MAX并无进入符号表中。若是在编译过程当中出现了困惑,由于这个信息是会提到1024,并无提到MAX。若是MAX被定义在不是你写的头文件中,你可能根本不知道1024表明了什么。(并且define既没有类型也没有做用域)此时,用const定义MAX。const int MAX = 1024;
并且#define必须手动卸载,否则就会一直到结束。#define MAX 1024
.....#undef MAX
code
尽可能以const,enum,inline替换 #define
用编译器替换预处理器。
更详细请参考《Effective C++ 改善程序设计的55个具体作法》对象