一:c和c++差异
c: 面向过程:算法+数据结构 = 程序
c++:面向对象:算法+数据结构 = 对象 对象+通讯机制=程序
二:const
{
c:const修饰的变量,在c语言里是可以被指针间接修改的
#includeint main(int argc, char *argv[]) { const int a=5; int *p=&a; *p=9; printf("%dn",a); return 0; }
c++:const修饰的变量,不能被修改
#includeint main(int argc, char *argv[]) { const int a = 5; int *p = &a; *p = 9; printf("%dn", a); return 0; }
运行结果
}
define{
c:使用define定义常量
c++:一般不会使用define定义常量,而是用const
}
三:
引用{
int a = 5;
int &b = a;
引用就是取别名,
引用的作用{
1.作为参数,新参改变就是实参改变
2.作为返回值,返回的是变量本身而不是变量的值
}
c:
#includeint main(int argc, char *argv[]) { int a = 5; int &b = a; printf("a=%d b=%d &a=%p &b=%pn", a, b, &a, &b); return 0; }
运行
报错
c++:
#includeint main(int argc, char *argv[]) { int a = 5; int &b = a; //a和b的值和地址都一样,说明引用就是一个取别名,两个名字对应同一片空间 printf("a=%d b=%d &a=%p &b=%pn", a, b, &a, &b); return 0; }
运行
引用的作用:
#includevoid swap(int &a, int &b) //引用,a和b就是实参本身,所以可以改变实参的值 { int temp; temp = a; a = b; b = temp; } int & setval(int &a) //返回值为引用,返回的是变量本身而不是变量的值 { a = 15; return a; } int main(int argc, char *argv[]) { int a, b; a = 5; b = 6; swap(a, b); printf("a=%d b=%dn", a, b); setval(a) = 9; printf("a=%dn", a); return 0; }
}
四:
函数重载
相同的函数名,不同的参数(类型,数目,)
行为相识,逻辑不同使用重载
行为相同,逻辑相同应该用模板
c++:
#includeint add(int a, int b) { printf("111111n"); return a + b; } int add(int a, int b, int c) { printf("2222222n"); return a + b + c; } double add(int a, double b) { printf("33333333n"); return a+b; } int main() { int a = 1,b = 2,c = 3; double d = 4.13,e = 3.14; add(a,b); add(a,b,c); add(a,d); }
重载和默认参数的歧义
#includeint add(int i, int j = 2, int k = 3); int add(int i, int j); int add(int i, int j, int k) { return i + j + k; } int add(int i, int j) { return i + j; } int main() { int i = 5, j = 6; printf("%dn", add(i)); //add(i,j) 这里不知道是使用三个参数的还是使用两个的所有会有歧义 }
五:
默认参数
注意!!!! 默认参数只能写在函数的声明
1.传参只能从左往右
2.默认参数一定是从右到左
六:
c NULL代表空指针,是0
c++ nullptr代指无效指针
#includeint main(int argc, char *argv[]) { //NULL代表空指针,但是可以赋值给一个整型变量这是不合理的,所以c++使用nullptr代表无效地址 unsigned long a = NULL; return 0; }
七:
mutable 修饰的变量可以被更改
mutable 不能和const和static直接连用
#includeint main(int argc, char *argv[]) { //const修饰的变量不能改变,但是c语言可以通过指针去间接改变不合理,c++不允许 const int a = 5; int *p = &a; *p = 9; printf("%dn", a); return 0; }
#includestruct demo { int a; mutable int b; }; int main() { struct demo A ={100,102}; A.b=90; printf("%d,%dn",A.b,A.a); return 0; }
八:
内敛函数:直接展开函数体(效率会更高)
限制:逻辑简单的函数,不会有复杂逻辑(不能有switch,for)
一般不超过5行
inline: 在函数声明的位置直接实现(一般不会有函数声明)
#includeinline int add(int a, int b) { return a+b; } int main() { int sum = add(1,2); printf("sum=%dn", sum); }
九:
开辟空间与释放{
c:malloc开辟, free释放 函数
c++:new开辟(异常处理失败的情况), delete释放 运算符
#includeint main() { #if 0 int *p = (int*)malloc(sizeof(int)); if(NULL == P) perror("malloc"); *p = 5; free(p); int *a = new int; *a = 5; delete a; #endif int *p = new int[5]; p[0] = 2; printf("%d", p[0]); delete []p; }
malloc(sizeof(int)*n)
new int[n]
free(p)
delete []p;
}
十:
作用域
c:全局,局部
c++:局部,全局,类域,名词空间
namespace
#includenamespace my{ int a = 2; } int main() { int a = 1; printf("%d", my::a);
十一:
全局变量
#includeint a; int a = 5; int main() { printf("a=%dn", a); }
c语言编译通的过
c++编译无法通过



