系列文章目录
一、C++中类的定义
- 在用C++语言实现面向对象程序设计时,也使用了类与对象的概念,并通过下面的方法来模拟对象的状态和行为:
(1)对象的状态(属性)通过对象的属性数据来描述。
(2)对象的行为是定义一个函数集,一个对象完成一个行为是通过该对象调用相应的函数来实现的。 - 类中的变量用来描述对象的状态(属性),这些变量被称为数据成员(或成员数据)。
类中的函数用来描述对象的方法(行为),这些函数被称为成员函数(或函数成员)。 - 定义类的一般语法格式:
class <自定义类类型名>
{
[public:]
[<公有成员说明表>]
[private:]
[<私有成员说明表>]
[protected:]
[<保护成员说明表>]
};
例1:用C++中的类来模拟圆类
求解思路:要用C++语言模拟圆类的类名、属性和方法3部分。
(1)取名为Circle
(2)属性:变量m_x、m_y、m_radius分别代表圆心的x坐标、y坐标及圆的半径
(3)方法:函数void setCenter(double x,double y)、void setRadius(double radius)分别描述“设置圆心”的方法和“设置半径”的方法
使用C++实现的代码如下:
class Circle
{
public:
double m_x, m_y;
double m_radius;
void setCenter(double x, double y)
{
m_x = x;
m_y = y;
}
void setRadius(double radius)
{
m_radius = radius;
}
double getArea()
{
return 3.14 * m_radius * m_radius;
}
};
二、构造函数
对象就是类的一个变量,和其他变量一样,也可以在创建对象时为对象的数据成员赋初值。在C++中,对象的初始化工作是由一个特殊的成员函数——构造函数来完成的,该函数在创建一个对象时被自动调用。
构造函数可以重载,以满足对象多样性的初始化需要。
构造函数的特点如下:
1.构造函数名必须与类名相同。
2.构造函数没有任何返回类型,void也不行。
3.任意一个新的对象被创建时,编译系统都会自动调用构造函数,完成对该对象数据成员的初始化工作。
4.如果在类定义时没有给出构造函数,系统会自动提供一个默认的无参构造函数:<类名>(){}
例2:在例1定义的Circle类中增加两个构造函数,分别能够实现下列两种情况下圆对象的初始化工作
(1)圆的半径和圆心未知,将对象的圆心设置默认值(0,0),将对象的半径设置为默认值1。
(2)用已知的圆的圆心和半径来初始化对象的数据成员。
构造函数定义的相关代码如下:
#include<iostream>
using namespace std;
class Circle
{
public:
double m_x, m_y;//数据成员,描述对象的属性——圆心
double m_radius;//数据成员,描述对象的属性——半径
Circle()//无参构造
{
m_x = 0;
m_y = 0;
m_radius = 1;
}
Circle(double x, double y, double radius)//有参构造
{
m_x = x;
m_y = y;
m_radius = radius;
}
void setRadius(double radius)//成员函数,设置半径
{
m_radius = radius;
}
double getArea()//成员函数,求圆面积
{
return 3.14 * m_radius * m_radius;
}
};
int main()
{
Circle circleA, circleB(2, 2, 12.5);
cout << circleA.m_radius << endl;
cout << circleB.m_radius << endl;
}
三、C++中对象的定义和访问
定义对象的过程叫做类的实例化,即由类产生一个具体的对象(实例)。类是一种用户自定义的数据类型,需要通过定义类的变量(即对象),才能通过对象来解决实际问题。
(1)对象的定义语法格式:类名 对象名表;
(2)对象的访问
一个对象创建以后,访问它的数据成员或调用它的成员函数,可通过两种方式:
1)对象名+对象成员运算符"."
2)对象指针+箭头成员访问运算符"->"
例3:编写一个完整的程序,完成对圆类的定义,对象的定义,以及对象成员的访问。
#include<iostream>
using namespace std;
class Circle//定义圆类
{
public:
double m_x, m_y;
double m_radius;
//无参构造函数
Circle()
{
m_x = 0;
m_y = 0;
m_radius = 1;
}
Circle(double x, double y, double radius)
{
m_x = x;
m_y = y;
m_radius = radius;
}
void setCenter(double x, double y)
{
m_x = x;
m_y = y;
}
void setRadius(double radius)
{
m_radius = radius;
}
double getArea()
{
return 3.14 * m_radius * m_radius;
}
};
int main()
{
Circle circleA, circleB(2, 2, 12.5);
Circle* pCircle = &circleB;//定义circle类的指针,该指针指向circleB对象
//对象访问数据成员
cout << "圆A的圆心为:(" << circleA.m_x << "," << circleA.m_y << ")" << endl;
cout << "圆A的半径为:" << circleA.m_radius << endl;
//对象访问成员函数
cout << "圆A的面积为:" << circleA.getArea() << endl;
//指针访问数据成员
cout << "圆B的圆心为:(" << pCircle->m_x << "," << pCircle->m_y << ")" << endl;
cout << "圆B的半径为:" << pCircle->m_radius << endl;
//指针访问成员函数
cout << "圆B的面积为:" << pCircle->getArea() << endl;
//外界直接访问对象的数据成员调整对象属性值
circleA.m_x = 5; //调整cicleA圆心的x坐标
circleA.m_y = 10; //调整cicleA圆心的y坐标
circleA.m_radius = 5.5; //调整cicleA的半径
//向对象发出消息调整由对象自己调整自己的属性值
circleB.setCenter(3, 3); //调整circleB的圆心
circleB.setRadius(5.6); //调整circleB的半径
cout << "圆A的圆心为:(" << circleA.m_x << "," << circleA.m_y << ")" << endl;
cout << "圆A的半径为:" << circleA.m_radius << endl;
cout << "圆A的面积为:" << circleA.getArea() << endl;
cout << "圆B的圆心为:(" << pCircle->m_x << "," << pCircle->m_y << ")" << endl;
cout << "圆B的半径为:" << pCircle->m_radius << endl;
cout << "圆B的面积为:" << pCircle->getArea() << endl;
return 0;
}
//数据成员应设为私有,通过成员函数进行访问(封装)
四、类成员的访问控制
C++是通过三个关键字public(公有)、private(私有)、protected(保护)来指定类成员的访问控制的。类成员的访问控制实现了类的封装性。
(1)公有成员:在public区域内声明的成员是公有成员
公有成员在程序的任何地方都可以被访问。一般将公有成员限制在成员函数上,使其作为类与外界的接口,程序通过这种函数来操作类对象。
(2)私有成员:在private区域内声明的成员是私有成员。
私有成员只能被该类的成员函数或该类的友元访问。程序必须通过类的公有成员函数才能间接地访问类的地私有成员,从而实现了对类成员的封装。
(3)保护成员:在protected区域内声明的成员是被保护的成员。
被声明为protected访问级别的数据成员或成员函数只能在该类的的内部或其派生类类体中使用。
注:1)类中可以出现多个访问说明符,每个访问说明符可以出现多次,不同的访问说明符出现的顺序没有限制。2)如何没有指明是哪种访问级别,C++编译系统默认为私有成员。
例:合理设置圆类的各成员的访问控制方式。
问题求解思路:
- 圆类中的数据成员一般设置为私有成员,在内部对其进行维护。所以将圆类描述圆属性的数据成员m_x、m_y、m_radius设置为私有成员,类外不能直接访问对象的数据成员。
- 将成员函数setCenter(double x,double y)、setRadius(double radius)和getArea(),设置为公有成员,作为类对外的接口。
- 由于类外还需要得到圆的圆心和半径的信息,因此还需要在类中再提供getX()、getY()、getRadius()等三个接口。
程序的C++实现如下:
#include<iostream>
using namespace std;
/* C++通过三个关键字public(公有)、private(私有)以及protected(保护)来指定类成员的访问控制的。
类成员的访问控制实现了类的封装性。(1)公有成员:在程序的任何地方都可以被访问;(2)私有成员:
只能被该类的成员函数或该类的友元访问;(3)保护成员:被声明为保护访问级别的数据成员或成员函
数只能在该类的内部或其派生类类体中使用。
如果没有指明是哪种访问级别,C++编译系统默认为私有成员 */
class Circle
{
public:
Circle()//无参构造函数
{
m_x = 0;
m_y = 0;
m_radius = 1;
}
Circle(double x, double y, double radius)//有参构造函数
{
m_x = x;
m_y = y;
m_radius = radius;
}
double getRadius() //获取半径
{
return m_radius;
}
double getArea() //求圆面积
{
return 3.14 * m_radius * m_radius;
}
double getX()
{
return m_x;
}
double getY()
{
return m_y;
}
void setCenter(double x, double y) //设置圆心
{
m_x = x;
m_y = y;
}
void setRadius(double radius) //设置半径
{
m_radius = radius;
}
private:
double m_x, m_y; //圆心
double m_radius; //半径
};
//int main()
//{
// //此时无法直接访问类内的数据成员
// Circle circleA;
// circleA.m_x = 5;
// circleA.m_y = 5;
// cout << "圆A的圆心为:(" << circleA.m_x << "," << circleA.m_y << ")" << endl;
// cout << "圆A的面积为:" << circleA.getArea() << endl;
// return 0;
//}
int main()
{
Circle circleA/*,circleB(1,1,2)*/;
circleA.setCenter(5, 5);
cout << "圆A的圆心为:(" << circleA.getX() << "," << circleA.getY() << ")" << endl;
/*cout << "圆B的圆心为:(" << circleB.getX() << "," << circleB.getY() << ")" << endl;*/
cout << "圆A的面积为:" << circleA.getArea() << endl;
return 0;
}
总结
以上就是今天整理的内容,本文介绍了C++中类的定义、构造函数、对象的定义和访问、类成员的访问控制,接下来的文章将继续学习记录C++中的基础知识。