C与C++区别:
1.输入输出
c语言的输入输出`
#include<stdio.h>//头文件
int a;
scanf("%d",&a);//输入
printf("%d",a);//输出
c++的输入输出
#include<iostream>//头文件
using namespace std;//打开std命名空间
int a;
cin>>a>>endl;//cin是预定义好的输入流对象名,>>是提取运算符,从键盘取输入
cout<<a;//cout是预定义的输出流对象名,<<是插入运算符。endl用于换行
俩种语言输入输出优缺点:
scanf是格式化输入函数,cin是标准化输入流对象,scanf对类型有要求,cin不区分类型
例: int a;
char ch;
scanf("%d %c",&a,&ch);
cin>>a>>ch;
注意:cin不允许cin>>a,ch,必须每一个变量前都要有提取符>>
cout相对于printf的缺点是:
例:
printf(“a=%d”,a);
而cout是这样的
cout<<“a=<<a<<”<<endl;
输出较为麻烦。
2.常量的区别
c语言:
#define Pi 3.14//宏常量
#define MAX 10
enum {LEN=10};//枚举常量
c++:
const int max=10;//常变量
define与cinst的区别:
define 定义的是宏常量
1. 宏常量在预编译的时候进行替换
2. 宏常量不分配空间
3. 宏常量并没有类型
const 修饰的是常变量
1. 常变量在编译时进行替换
2. 常变量分配空间
3. 常变量会有类型的检查
3. 引用
引用 & :就是别名/外号, 一旦引用初始化为某个变量,就可以使用引用名称直接使用该变量,就是给该变量起了个别名
引用的特点:1.没有空引用 2.定义引用时必须进行初始化 3.没有二级引用
引用使用的例子:
void Swap_cpp(int &a, int &b)//在函数中对a,b的交换,就是对实参的交换
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int x=10;
int y=20;
Swap_cpp(x,y);
}
形参中的a,b是x,y的别名,也就是引用。直接进行交换x,y的数据
4.函数重载
c语言中不支持函数重载,因为它编译时只对函数名生成符号
而c++支持重载,它在形成符号时,不仅关联函数名,还有形参。
所以重载函数的依据是:
1.参数类型
2.参数数量
但函数的返回值不能区分重载函数,因为编译器不能识别返回值类型
5.默认形参
C++函数的形参可以带默认值,参数列表的默认值从右向左依次给,不能跳着给
调用函数时,实参是从左向右依次给,不能跳着给
void Cpp(int a,int b=0,int c,int d=10)//错误,不能跳着给
void Cpp(int a,int b,int c=1,int d=10)//正确
int main()
{
Cpp(1, ,2 );//错误
Cpp(1,2);//正确
}
6.开辟空间方法不同
c语言:
int *p = (int *)malloc(sizeof(int));
free(p);
c++
int *s = new int;//开辟一个整型空间
int *p = new int(10);//开辟并初始化
delete s;
开辟数组空间:
int n;
cin>>n;
int *p = (int*)malloc(sizeof(int)*n);//C语言
int *s = new int[n];//C++
int *t = new int[n](100);//开辟并初始化,C99标准
free(p);
delete []s;
delete []t;
类与对象:
类
现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只有当类实例化为对象时,给对象分配内存
类是设计的产物,对象是对类的实例化,设计类型时并没有给其开辟空间,实例化为对象后开空间,我们操作的是对象,而不是类。
对象
对象是类的实例。声明一种数据类型只是告诉编译系统该数据类型的构造,并没有预定内存。设计出来的类只是一个样板,以此样板可以在内存中开辟出同样结构的实例——对象。
创建类的对象可以有两种方法:
1.直接定义类的实例对象,创建在栈区:CGoods Car; int I;
2.动态创建类的对象,创建在堆区:CGoods *p = new CGoods();
类与对象
1.四种访问类型
缺省
pricate 私有
public 公有
protected 保护
如果在类起始点无访问说明符号,系统默认为private。
2…编译过程
1).对属性的识别
2).对方法的识别
3) .改写类的方法成员
改写的方法如下:
原方法:
void CGoods::RegisterGoods(char name[], int amount, float price)
{
strcpy(Name, name);
Amount = amount;
Price = price;
}
编译器会改写为:
void CGoods::RegisterGoods(CGoods *const this, char name[],int amount,float price)
{
strcpy(this->Name, name);
this->Amount = amount;
this->Price = price;
}
在类里面识别到的属性和类成员函数属性同名时,就会加上this指针,这是编译器编译时自动加的,我们也可以手动加,编译时系统就不给你加了。
而主函数此时变化是这样的:
int main()
{
CGoods x;
CGoods y;
x.RegisterGoods("C++",16,94);
y.RegisterGoods("Java",10,88);
}
//变为:
RegisterGoods(&x,"C++",16,94);
RegisterGoods(&y,"Java",10,88);