C++类定义与实现
一、类的介绍
类是用户自定义的类型,并且该类型具有一定的行为能力(类中说的描述方法)。通常来说,一个类中包含两部分的内容,一是该类的属性,另一部分是它所拥有的方法。比如说“人”这个类,具有姓名,性别,年龄等属性;此外,人能够吃饭,睡觉,行走等行为称为方法。
1.类的声明:即类的成员函数声明,以成员函数的方式被称为公有接口
接口:一个共享的框架,主要由我们写的方法提供
二、类的定义
class是C++中新增的关键字,专门用于定义类。
class 类名
{
public:
//公共的行为或属性
protected:
//保护的行为或属性
private:
//私有的行为或属性
};
在类内部定义函数体
class 类名
{
返回类型 函数名(形参列表){
函数体
}
};
在类外部定义函数体
class 类名{
返回类型 函数名(形参列表);
};
返回类型 类名::函数名(形参列表){
函数体
};
这两种定义方法看起来没什么区别,其实它们还是有区别的,类内部定义的函数,程序在要调用它的时候会把它当成一个内联函数,内联函数调用速度更快。但是会占用额外的内存空间,每调用一次相当于定义一次。而外部定义的函数,不会被当做内联函数,类似与递归函数等,定义为内联函数肯定不合理的。所以建议用外部定义函数体。
类的定义一般放在程序文件开头,或者放到头文件中被程序文件包含。也可以放在局部作用域中。在C++规定中,在局部作用域中声明类,成员函数必须是函数定义形式,不能原型声明。
类相当于一种新数据类型,数据类型不占用存储空间,用类定义实体时候,才会为它分配空间。
说明:
①类名 需要遵循一般的命名规则;
②类定义结束的分号不能省略;
③public、protected和private为属性、方法限制的关键字,private表示该部分内容是simi私密,不能被外部所访问或调用,只能被类内部方法进行访问,protected表示受保护成员,可以被继承,并被派生类对象进行访问。不能被(类外)访问;public表示公开的属性和方法,外界可以直接访问或者直接调用。
类只是一个模板(Template),编译后不占用内存空间,所以在定义类时不能对成员变量进行初始化,因为没有地方存储数据。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。
class People{
private:
char *name;
int age;
char *sex;
public:
void Print(){
cout<<"姓名"<<name<<"性别"<<sex<<"年龄"<<age;
}
};
三、类的实现
在上面的定义示例中我们只是定义了这个类的一些属性和方法声明, 并没有去实现它, 类的实现就是完成其方法的过程。类的实现有两种方式, 一种是在类定义时完成对成员函数的定义, 另一种是在类定义的外部进行完成。
1.类定义是定义成员函数
#include <iostream>
using namespace std;
class Point{
public:
void setPoint(int x,int y) //实现setPoint函数
{
xPos=x;
yPos=y;
}
void printPoint(){ //实现printPoint函数
cout<<"x="<<xPos<<endl;
cout<<"y="<<yPos<<endl;
}
private:
int xPos;
int yPos;
}
int main(){
Point M; //用定义好的类创建一个对象 点M
M.setPoint(10,20); //设置M点的x,y值
M.printPoint(); //输出M点的信息
return 0;
}
x=10
y=20
与类的定义相比,在类内实现成员函数不再是在类内进行声明,而是直接将函数直接定义,在类中定义成员函数时,编译器默认将其定义为inline函数
2.在类外定义成员函数
在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现
返回类型 类名::成员函数名(参数列表)
{
//函数体
}
#include <iostream>
using namespace std;
class Point
{
public:
void setPoint(int x, int y); //在类内对成员函数进行声明
void printPoint();
private:
int xPos;
int yPos;
};
void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
{
xPos = x;
yPos = y;
}
void Point::printPoint() //实现printPoint函数
{
cout<< "x = " << xPos << endl;
cout<< "y = " << yPos << endl;
}
int main()
{
Point M; //用定义好的类创建一个对象 点M
M.setPoint(10, 20); //设置 M点 的x,y值
M.printPoint(); //输出 M点 的信息
return 0;
}
setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式, 其返回类型、成员函数名、参数列表都要与类内声明的形式一致。、
我们之前说过,定义类型时不会分配存储空间,当定义一个对象的时候,将为其分配存储空间。
当然,有时候人们也希望可以动态的为其分配内存,当不用的时候再销毁它,就有了如下定义方式:
Point *p;
p=new Point;
当不再使用此动态对象的时候,必须用delete:
delete p;
访问对象中的成员有三种方法:
通过对象名和对象成员引用运算符 (.)
通过指向对象的指针和指针成员引用运算符 (->)
通过对象的引用变量和对象成员引用运算符 (.)
Point P;
P.printPoint();
Point *p;
p=new Point;
p->printPoint();
Point p;
&P=p;
P.printPoint();