**
基础
**
1、输入输出
与C有一点小不一样,C大多数情况下用格式化输入输出函数,个别时候用puts。而Cpp一组cin和cout全部ac,不需要自己记着格式来进行输入输出。
string str;
cin >> str;//输入
cout << "Hello World" << endl;//输出
输入输出挺舒服的,没必要用“%”了,芜湖~
mooc给了一个练习,泡沫排序,说实话和C没啥太大区别,如下:
int* paixu(int* shuzu,int size){//泡沫排序
//
int* a=new int[10];
for (int i = 0; i < 10; ++i) {
cin >> *(a+i);
}//输入
for (int j = 0; j < 10; ++j) {
cout << *(a+j) << ' ';
}
cout << endl;
//输出
int i,j;
int temp;
temp=0;
i=0;
j=0;
for(i;i<size;i++){
for(j=i+1;j<size-1;j++){
if(*(shuzu+i)>*(shuzu+j)){
temp=*(shuzu+i);
*(shuzu+i)=*(shuzu+j);
*(shuzu+j)=temp;
}
}
}//泡沫排序
return shuzu;
}
2、数据类型
比起C,一共多了bool类型变量、引用类型变量和抽象的类类型变量。其中bool在很多高级语言中多很实用,比如C#中就有很多is开头的函数用来判断true或false。引用类型即 int value; int &mypt=value;
mypt即value的引用,可以理解为,指针是取到了对应空间的地址,指向同一个内存空间。但引用仅仅是将原变量换了一个名字,远没有指针灵活,不过给了coder们给变量多次命名的方法。至于类变量,需要创建类,用类名实例化,涉及到面向对象的知识。到了面向对象,代码更加的整齐,不像C一样想实现一个功能只能编写一个函数。面向对象的引入实现了代码的聚合,方法也不单是方法,而是类的方法,重构和引用也让编程更灵活。
3、动态内存管理
Cpp中的动态内存管理都封装好了,利用new就可以了。
int* pt=new int[100];
其中要注意,delete释放的空间一定要是new出来的空间,不能是直接创建的空间,只能new空间用delete。实在不行自己free去。反正别的不说了,至少动态内存分配不用老子一个一个打malloc了,傻瓜分配。
这里提一嘴随机数,随机数的构建我参考了一些资料,过程如下:
1、创建unsigned类型变量
2、为了产生随机数,需要用time(0)赋值,由于ctime库中取到的值随着时间一直在变化,因此seed取值为time(0)可以保证在取到随机数的时候随机性。
3、srand(seed),即seed of random,将seed装入即可。
4、调用rand()函数,返回的值就是一个随机数,想取到多少的随机数就整除多少
4、函数的重载
好像没什么可以说的,参数不一样就行,编译器会自己判断。
啊对了,这里可以取到默认形参值,需要注意默认形参的定义必须是从后向前,不然会出现错误。
5、内联函数
这个挺有意思,内联函数对标宏定义。宏定义的使用避免了程序运行过程中像普通函数使用时的系统开销,并且宏定义的参数可以使用于大多数数据类型。
可是,宏定义在使用的时候也会遇到一些意想不到的错误。于是,为了弥补宏定义的缺点,内联函数产生了。区别于普通函数,内联函数游走于宏定义和普通函数中之间。
通常,在C语言中,内联展开的功能由带参宏(Macros)在源码级实现。内联提供了几个更好的方法:
1、宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
2、C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
3、在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
4、许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
5、内联代码的调试信息通常比扩展的宏代码更有用。 [1]
当然,内联函数也有不足:
除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:
1、通常,设计编译器的程序设计者比大多数的程序设计者更清楚对于一个特定的函数是否合适进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。
2、对于一些开发中的函数,它们可能从原来的不适合内联扩展变得适合或者倒过来。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出了。
3、对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用该函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。 [1]
比较一个经典的可以展现内联优点的例子:
#define abs(a)((a)<0? -(a):a)
int m=-2;
ret=abs(++m);
abs(++m);
由于宏定义不进行类型检查,表达式也当作一般式子进行,即在判断的时候进行了两次自增,阿门,简直是太过分了。
5、常量
#define PI 3.14
const float PI=3.14;
其中宏定义的define是在编译时完成替换,即字母和所对应数字同义。运行期间不消耗内存空间。
而const的只是在程序运行期间占据内存空间,只是用const来指明该内存空间只读约束。
6、引用
引用主要分为:独立引用、作为函数参数、作为函数返回类型。
独立引用:
int a;
int &ra=a;
引用作为函数参数:
实参形参就是引用
引用作为函数的返回:
在C中经常用的,借用指针实现返回,或者直接返回指针。