快开学了要复习了。今天来复习c++基本的一些特性
c++是面向对象的语言。类拥有属性和方法,用来描述抽象事物,而对象则是活生生的实例。
通过class关键字可以定义一个类
class Cow
{
private:
int age;
protected:
double weight;
public:
bool isMale;
};
一个类具有public protected 和 private 三种类型的成员。成员可以是变量或者函数。下面给出三种成员的访问控制表
修饰 | 访问规则 |
---|---|
public | 任何情况均可访问 |
protected | 该对象及其继承者可访问 |
private | 仅该对象自己可访问 |
构造函数和析构函数是两种特殊的函数,用于在对象创建时,传入初始化参数,或者是在对象销毁时,删除对象占用的某些空间(当然得自己编码实现)。
构造函数无返回值,名字和类名相同,可以如下形式声明构造函数。
class Cat
{
public:
Cat(){}
};
析构函数则是在构造函数函数名前面加上 ~
符号
class Cat
{
public:
Cat(){}
~Cat(){}
};
构造函数如同任何函数一样,支持重载,即不同的初始化方式。
class Cat
{
private:
int age;
public:
Cat(){}
Cat(int Age){age=Age;}
~Cat(){}
};
值得注意的是,任何时候,良好的习惯,都最好准备无参数的构造函数。
通过调用类的构造函数,可以创建实例化的对象。多个构造函数,只需要调用一个即可。
class Cat
{
private:
int age;
public:
Cat(){}
Cat(int Age){age=Age;}
~Cat(){}
};
int main()
{
Cat mycat1(123); // 创建对象1
Cat mycat2 = Cat(123); // 创建对象2
Cat mycat3; // 创建对象3
return 0;
}
值得注意的是,如果直接创建变量,即 Cat mycat
,那么会调用无参的构造函数。
通过 对象变量.成员名称
的方式可以访问对象的成员,比如我们取出 mycat1 对象的 age 属性,并且赋值给temp变量:
int temp = mycat1.age;
上文提到,外部程序只能访问public的成员,如果访问私有成员,则会编译报错。友元函数提供了一种外部函数访问类的私有变量的方式。
友元函数相当于白名单,友元函数内的代码,可以访问类的私有成员。
声明一个友元函数,我们只需要在正常函数声明之前加上friend
关键字。如下的代码声明了名为getCatAge
的友元函数,然后这个友元函数就获得了调用Cat对象成员的权力。
#include
using namespace std;
class Cat
{
private:
int age;
public:
Cat(){}
Cat(int Age){age=Age;}
friend void getCatAge(Cat& c);
};
void getCatAge(Cat& c)
{
cout<<c.age<<endl;
}
int main()
{
Cat mycat = Cat(114);
getCatAge(mycat);
return 0;
}
程序输出:
114
静态成员不同于一般成员变量。一个对象对应一组普通成员变量,n个对象对应n组普通成员变量,而静态成员则是所有对象共享的值。即不管创建多少个对象,静态成员变量都只有一个。
使用 static
关键字修饰的变量称之为静态成员变量。如下的代码声明了名为count的静态成员变量,可以用它表示Cat对象被创建的次数。我们在Cat对象的构造函数中,令其++即可。
class Cat
{
private:
int age;
public:
static int count;
Cat(){count++;}
};
除此之外,我们还要在 类的定义之外 初始化静态成员。使用类名::成员名
的方式来表示静态成员变量。
int Cat::count = 0;
之后,使用Cat::count
即可访问该静态成员。下面的例子颜色了使用静态成员记录对象被创建的次数:
#include
using namespace std;
class Cat
{
private:
int age;
public:
static int count;
Cat(){count++;}
};
int Cat::count = 0;
int main()
{
Cat c1;
Cat c2;
Cat c3;
cout<<Cat::count<<endl;
return 0;
}
输出:
3
同样使用static修饰,值得注意的是,静态成员函数,在不创建类的实例化对象的情况下,也可以被调用。此外,静态成员函数只能访问或者操作类的静态成员变量。
通过 类名::静态函数名
可以访问静态成员函数。
如下的代码演示了使用静态成员函数存取count静态变量,并且记录对象被创建的次数。
#include
using namespace std;
class Cat
{
private:
static int count; // 静态变量记录创建次数
int age;
public:
Cat(){count++;}
// 静态函数
static int getCount()
{
return count;
}
static void setCount(int val)
{
count = val;
}
};
int Cat::count = 0;
int main()
{
Cat::setCount(100);
Cat c1;
Cat c2;
Cat c3;
cout<<Cat::getCount()<<endl;
return 0;
}
输出
103
请完成如下要求:
1.实现Point类;
2.为Point类增加一个友元函数double Distance(Point &a, Point &b),用于计算两点之间的距离。直接访问Point对象的私有数据进行计算。
3.编写main函数,输入两点坐标值,计算两点之间的距离。
第1行:输入需计算距离的点对的数目
第2行开始,每行依次输入两个点的x和y坐标
每行依次输出一组点对之间的距离(结果直接取整数部分,不四舍五入 )
2
1 0 2 1
2 3 2 4
1
1
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class Point
{
private:
double x, y;
public:
Point(){}
Point(double X, double Y){x=X;y=Y;}
friend int distance(Point& p1, Point& p2);
};
int distance(Point& p1, Point& p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
}
int main()
{
int t; cin>>t;
while(t--)
{
double x1, y1, x2, y2;
cin>>x1>>y1>>x2>>y2;
Point p1(x1, y1), p2(x2, y2);
cout<<distance(p1, p2)<<endl;
}
return 0;
}
编写程序,统计某旅馆住宿客人的总数和收入总额。要求输入客人的姓名,输出客人编号(2015+顺序号,顺序号4位,如第1位为0001,第2位为0002,依此类推)、姓名、总人数以及收入总额。
总人数和收入总额用静态成员,其他属性采用普通的数据成员。旅馆类声明如下:
第1行:输入旅馆单个顾客房租
第2行开始,依次输入顾客姓名,0表示输入结束。
每行依次输出顾客信息和当前旅馆信息。包括顾客姓名,顾客编号,旅馆当前总人数,旅馆当前总收入。
150
张三 李四 王五 0
张三 20150001 1 150
李四 20150002 2 300
王五 20150003 3 450
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class Hotel
{
private:
static int totalNum;
static double totalIncome;
static double rentPrePerson;
string name;
int number;
public:
Hotel(){totalNum++; totalIncome+=rentPrePerson;}
Hotel(string na, int nu){name=na; number=nu; totalNum++; totalIncome+=rentPrePerson;}
void display(){cout<<name<<" "<<number;}
// 静态成员存取
static int getTotalNum(){return totalNum;}
static double getTotalIncome(){return totalIncome;}
static double getRentPrePerson(){return rentPrePerson;}
static void setTotalNum(int val){totalNum=val;}
static void setTotalIncome(double val){totalIncome=val;}
static void setRentPrePerson(double val){rentPrePerson=val;}
};
// 初始化
int Hotel::totalNum = 0;
double Hotel::totalIncome = 0;
double Hotel::rentPrePerson = 0;
int main()
{
double rent; cin>>rent;
Hotel::setRentPrePerson(rent);
int numberBasic = 20150000;
while(1)
{
string name;
cin>>name;
if(name=="0") break;
Hotel h(name, ++numberBasic);
h.display();
cout<<" "<<Hotel::getTotalNum()<<" "<<Hotel::getTotalIncome()<<endl;
}
return 0;
}