C++类的讲解
1、面向对象和类的介绍
1)面向对象 C语言使用面向过程的编程方式,而C++则增加了面向对象的编程方式。
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象 :把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 性能对比:
面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。
面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
面向对象的三大特性:封装、继承、多态
2)类 类是一种将抽象(问题的本质)转换成用户自定义的类型的一种C++工具,它将数据表示和操纵数据的方法组合成了一个整洁的包。这个包提供对外的接口让用户调用。
类与结构的区别:类是C++对结构进行扩展后的结果。但结构的默认访问类型是public,而类为private。
2、类的建立
1、类的声明 (继承相关的内容在之后会讨论)
#include<iostream>
using namespace std;
class student
{
public:
……
protected:
……
private:
……
}
int main(){
{
student s;
}
关键字public和private和protect是类的控制访问,在类中的顺序没有固定要求,这三个分别描述了对类成员的不同的访问权限。但类中可以互相调用彼此,不受限制。 当没有使用任何的访问控制关键字时,默认算是private!
2、成员函数的说明 1、类中成员函数有三种定义方式 1)直接在类中定义
class student
{
public:
void function(int a,int b){
x=a;
y=b;
}
private:
int x,y;
}
2)在类声明中只给出成员函数的原型,成员函数的定义则放在类的外部
class student
{
public:
void function(int,int);
private:
int x,y;
}
void student::function(int a,int b)
{
x=a;
y=b;
}
3)将函数作为内联函数进行处理
class student
{
public:
inline void function(int,int);
private:
int x,y;
}
inline void student::function(int a,int b)
{
x=a;
y=b;
}
2、成员函数的使用 使用成员运算符调用成员函数
class print
{
public:
void _print(){
cout<<"你好!";
}
}
int main(){
print s;
s.print();
return 0;
}
输出:
你好!
3、特殊的成员函数——构造函数和析构函数 构造函数的介绍: 当类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,其作用是初始化对象的数据成员。 构造函数在类中不可缺少且函数名与类相同,构造函数不能有返回类型和返回值。
构造函数可以重载!(即下面几种构造函数可以共存)
构造函数建立在公有成员中,否则外部类对象无法调用构造函数来实现数据成员初始化!!!
构造函数的分类: 1)默认构造函数 如果你创建一个类时没有写任何构造函数,系统会自动生成默认的无参构造函数
class student
{
public:
void function(int,int);
private:
int x,y;
}
2)初始化构造函数
class student
{
public:
student(int _x,int _y){
x=_x;
y=_y;
}
private:
int x,y;
}
int main(){
student s(5,6);
return 0;
}
3)复制(拷贝)构造函数 用于对象之间的值传递 默认拷贝构造函数 即没有定义构造函数,此时编译器会给我们自动产生一个拷贝构造函数,其作用是将另一个对象里的所有数据复制到该对象。
class student
{
public:
private:
int x,y;
}
int main(){
student s(5,6);
student c=s;
}
自定义拷贝构造函数 可以自己定义要传送的数据
class student
{
public:
student(const student& c){
x=c.x;
}
private:
int x,y;
}
int main(){
student s(5,6);
student c=s;
}
4)类型转换构造函数 即实现类对象的数据类型的转换 只有一个参数
class student
{
public:
student(double c){
x=c;
y=0;
}
private:
int x,y;
}
int main(){
student s=5.0;
}
析构函数的介绍—— 与构造函数相反,析构函数是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在生命周期结束时,C++编译系统会自动调用析构函数,来完成类的一些资源清理工作。
析构函数的特性—— 1)析构函数名是在类名前加上字符~,且无返回类型,无参数,无返回值。 2)一个类有且只有一个析构函数。若用户没有显式定义,系统会自动生成默认的析构函数。 3)析构函数因为没有参数所以不能重载
class student
{
public:
student(int _x,int _y){
x=_x;
y=_y;
}
~student(){}
private:
int x,y;
}
4、类的运算符重载 当我们使用string类时,经常会用到 string定义的两个对象直接相加,这是怎么办到的呢? 这就用到了类的运算符重载,即在类中定义一个该对象与其他对象的运算函数,最后返回该对象,实现两个类的运算。 双目运算符形参为另一对象,单目运算符则不必写形参名!
class student
{
public:
student operator +(const student&c){
x=x+c.x;
y=y+c.y;
return *this;
}
private:
int x,y;
}
int main(){
student s(5,6);
student c=s;
c=c+s;
}
这里补充关于this指针的知识点: 在C++中,每个对象都能通过this指针来访问自己的地址。this指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
class student
{
public:
student(student *const this,int _x,int _y){
x=_x;
y=_y;
}
private:
int x,y;
}
关于const与函数的补充: 当const在函数名前面的时候修饰的是函数返回值,在函数名后面则表示是常成员函数,该函数不能修改对象内的任何成员,即只能发生读操纵,不能发生写操作!
|