第四章 类与对象
面向对象程序设计的基本特点:
① 抽象
② 封装
③ 继承
④ 多态
复制构造函数的调用
① 用一个对象初始化另一个对象的时候
int main()
{
Point a(1,2);
Point b(a);
Point c = a;
cout<<b.getX()<<endl;
return 0;
}
② 当一个函数的形参为类的对象的时候,当函数调用时
void f(Point p)
{
cout<<p.getX()<<endl;
}
int main()
{
Point a(1,2);
f(a);
return 0;
}
③ 当函数返回值是类对象,返回函数值时调用
Point g()
{
Point a(1,2);
return a;
}
int main()
{
Point b;
b = g();
return 0;
}
类的组合
类的初始化:
构造函数 例如:Circle::Circle(float r):radius(r){}
复制构造函数 例如:C::C(C &c1):b(c1.b) {...}
下面是一个简单的类的组合:
#include<iostream>
#include<cmath>
using namespace std;
class Point{
public:
Point(int xx=0,int yy=0):x(xx),y(yy){};
Point(Point &p);
int getx(){return x;}
int gety(){return y;}
private:
int x;
int y;
};
Point::Point(Point &p)
{
x = p.x;
y = p.y;
}
class Line{
public:
Line(Point xp1,Point xp2);
Line(Line &l);
double getlen(){return len;}
private:
Point p1,p2;
double len;
};
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)
{
double x=p1.getx()-p2.getx();
double y=p1.gety()-p2.gety();
len = sqrt(x*x+y*y);
}
Line::Line(Line &l):p1(l.p1),p2(l.p2)
{
len = l.len;
}
int main()
{
Point myp1(1,1),myp2(4,5);
Line line(myp1,myp2);
Line line2(line); //复制构造函数的调用
cout<<line.getlen()<<endl;
cout<<line2.getlen()<<endl;
return 0;
}
向前引用声明(两个类相互引用)
例如:
class B; //向前引用声明
class A{
public:
void f(B b);
};
class B{
public:
void g(A a);
};
尽管使用了向前引用声明,但是在提供一个完整的类定义之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象,但是可以声明类的对象引用或指针。
结构体和联合体
区别:
联合体:使几个不同变量的类型共占一段内存,即共同体变量中起作用的成员是最后一次存放的成员,在存入新的成员后原有的成员失去了作用
结构体:把不同类型的数据组合成一个整体——自定义数据类型
#include<iostream>
using namespace std;
class ExamInfo{
public:
ExamInfo(string name,char grade):name(name),mode(GRADE),grade(grade){}
ExamInfo(string name,bool pass):name(name),mode(PERCENTAGE),pass(pass){}
ExamInfo(string name,int percent):name(name),mode(PERCENTAGE),percent(percent){}
void show();
private:
string name;
enum{
GRADE,
PASS,
PERCENTAGE
}mode;
union{
char grade;
bool pass;
int percent;
};
};
void ExamInfo::show()
{
cout<<name<<":";
switch(mode)
{
case GRADE:cout<<grade;break;
case PASS:cout<<(pass?"PASS":"FAIL");break;
case PERCENTAGE:cout<<percent;break;
}
cout<<endl;
}
int main()
{
ExamInfo course1("English",'B');
ExamInfo course2("Calculus",true);
ExamInfo course3("C++ Programming",85);
course1.show();
course2.show();
course3.show();
return 0;
}