数据结构(data stucture)的定义:数据结构由数据元素的集合和该集合中数据元素之间的关系组成。
即{D,R}。
线性结构,即线性表(linearlist). ---数组(array),文件,栈(stack),队列(queue),优先级队列
非线性结构 ---集合,图
C++类默认访问级别是private
struct默认访问级别是 public 这可以说是他们的惟一区别。
union默认访问级别也是 public
流是个简单的字符序列
cout<<endl; 输出一个换行符,并清空流。
C++的输入输出:
void main()
{
ifstream inFile; //inFile为输入流对象
ofstream outFile; //outFile为输出流对象
outFile.open("my.dat",ios::out); //建立输出的目标位置,文件my.dat
char c_date[]="i love you,yanting";
int number;
outFile<<c_data<<endl; //输出到my.dat;
outFile<<number<<endl;
inFile.open("my.dat",ios::in|ios::nocreate);
if(!inFile)
{
cerr<<"不能打开my.dat"<endl;
exit(1);
}
inFile>>number;
}
// 解释:
open函数参数有两个,一个是文件名,另一个是数据流动方向,
其模式有:
ios::out
ios::in
ios::app //追加到文件末尾
ios::binary
ios::nocreate //文件不存在则打开失败 !
C++函数都有返回,用return表示返回一个与返回类型相同的值并终止函数的执行。
C++参数传递:
c++函数参数传递默认是采用传值,即copy一个副本,并不改变实参的值。
若需要传引用,则需要加上&,如 love(int &)。 引用传递的是实参的地址,所做改变都是对实参的改变。
如果参数是一个非常巨大的对象时,采用传引用将会节省非常多的传值时间,并且省去了副本占用的空间。
另外,当函数的返回值多于一个时,其中一个可由return返回,其他可使用引用型参数返回呢。
注意了:
传值的时候,参数可以是常量,常数,变量,表达式。
传引用时,只能是变量或者对象。
数组的传递非常特殊,传的是数组第一个元素的位置,也就是引用传递。 函数内部所做的改变将引起数组的变化,这一点必须牢记!
int addall(int a[],int n)
{
if(n>0) return a[n-1]+sum(a,n-1);
else return 0;
}
如果传递的参数是一个对象A,那么函数中会创建A的一个副本,创建时自然会调用A的复制构造函数,在函数结束的时候会调用副本的析构函数撤销这个副本。
此时若没有自定义的复制构造函数,将调用编译器自动产生的复制构造函数。 原对象A的构造函数中不可以使用指针动态创建内存空间,因为自动产生的复制构造函数只
进行简单的指针复制,不分配空间。 或者你自己定义复制构造函数。
C语言中动态分配空间使用函数malloc 通过free释放这个空间
c++则用new 和delete取代了malloc and free.
int *p=new int; 指针会根据类型自动强制转换。
delete p;
int *p=new a[100];
delete []a;
C++的继承性:
class shape{
public:
shape(point);
void move(point);
vitual double area()=0;
vitual void draw()=0;
private:
int count;
};
class traingle:public shape{
public:
traingle(point,point,point);
void draw();
double area();
private:
int details;
}
// 注意,继承不到父类的private属性。
c++的多态性:
c++支持两种多态性:
编译时多态性:函数名的重载,操作符的重载。 //编辑器通过参数的个数,顺序,类型不同而把他们变成名字不同的函数。
运行时多态性:通过派生类和虚函数实现。 //运行时通过虚函数列表来寻址函数地址,从而定位不同对象的函数。
操作符重载:
Point operator+(const Point&p);
Point operator*(int i);
int operator<(const Point& p);
输入输出符重载:
istream& operator>>(istream$ is,object& o) //重载输入运算
{
is>>o.id>>o.name>>o.sex;
return is;
}
ostream& operator<<(ostream$ os,object& o) //重载输出运算
{
os<<o.id<<o.name<<o.sex;
return os;
}
这样子,输入
cin>>o1;
cout<<o1; 将会以之前重载的方式输入输出。
C++的虚函数:
虚函数通过在基类中使用vitual修饰函数而产生,有两种情况:
1. vitual void draw(){
your code;
}
2. vitual void draw()=0; //不提供实现,需要在子类实现。 这样的虚函数称为纯虚函数(pure vitual function),如果一个类有至少一个纯虚函数,那么这个类就是抽象类(abstract class)。
抽象类不可以生成实例,只能被继承。