C++复习(1)对象,友元函数,静态成员与静态函数

目录

  • 前言
  • 类与对象
    • 类的定义
    • 构造与析构
    • 创建与访问成员
  • 友元函数
  • 静态成员变量与静态函数
    • 静态成员变量声明,初始化与访问
    • 静态成员函数
  • 题目
    • 距离计算(友元函数)
      • 题目描述
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码
    • 旅馆顾客统计(静态成员)
      • 描述
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码

前言

快开学了要复习了。今天来复习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

题目

距离计算(友元函数)

题目描述

Point类的基本形式如下:
C++复习(1)对象,友元函数,静态成员与静态函数_第1张图片

请完成如下要求:
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,依此类推)、姓名、总人数以及收入总额。

总人数和收入总额用静态成员,其他属性采用普通的数据成员。旅馆类声明如下:

C++复习(1)对象,友元函数,静态成员与静态函数_第2张图片

输入

第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;
}

你可能感兴趣的:(c++期末复习,c++,类)