C++语法01-类和对象的基本概念

1. 结构体的扩充

结构体是C语言的一种自定义的数据类型,在结构体中可以含有多种不同类型的数据。C++语言对结构体类型进行了扩充,它不仅可以含有不同类型的数据,而且还可以含有函数。

例如下面声明了一个扩充的结构体Complex:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Complex{	//声明了一个名为Complex的结构体
double real; //复试的实部
double imag; //复试的虚部
void init(double r,double i){
real=r;
imag=i;
}
double abscomplex(){
double t;
t=real*real+imag*imag;
return sqrt(t);
}
};

结构体中的数据和成员都是结构体的成员,在C++中,通常把结构体中的数据成为数据成员,把函数称为成员函数。为了访问这些成员函数,必须先定义该结构体类型的变量,然后像访问结构体中的数据一样进行访问。

C++提供了一种比结构体更安全有效的数据类型-类。类与结构体的扩充形式十分相似。上面的结构体类型Complex可以用类改写如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Complex{	//声明了一个名为Complex的类
double real; //数据成员,复试的实部
double imag; //数据成员,复试的虚部
void init(double r,double i){ //成员函数
real=r;
imag=i;
}
double abscomplex(){ //成员函数
double t;
t=real*real+imag*imag;
return sqrt(t);
}
};

类是一种数据类型,它是一种用户定义的抽象的函数类型。C++规定,在默认情况下,类中的成员是私有的,结构体中成员是共有的。

2. 类的声明

可以得出,类类型声明的一般形式如下:

1
2
3
4
5
6
class 类名{
[private:]
私有数据成员和成员函数
[public:]
公有数据成员和成员函数
};

说明:

(1)私有成员(用private声明)包括数据成员和成员函数只能被类内的成员函数访问,公有成员(用public声明)包括数据成员和成员函数既可被类内的成员函数访问,也可被类外的对象访问。

(2)除了private和public之外,类中的成员还可以用另一个关键字protected来说明。被protected说明的数据成员和成员函数称为保护成员。保护成员可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问。

(3)数据成员可以是任何数据成员,但不能是用自动(auto)、寄存器(register)或外部(extern)进行说明。

3. 成员函数的定义

类的成员函数是函数的一种,它也有函数名、返回值类型和参数表,用法和普通函数差不多,只是它属于一个类的成员。成员函数可以访问本类中任何成员(包括private、protected、public)

成员函数的三种定义方式

第一种:在类声明中只给出成员函数的原型,而将成员函数的定义放在类的外部。(类内声明,类外定义)

这种成员函数在类外定义的一般形式如下:

1
2
3
4
5
返回值类型 类名::成员函数名(参数表){

函数体

}

说明:在类声明中,成员函数的原型的参数表中可以不说明参数的名字,而只说明它们的类型。但是,在类外定义成员函数时,不但要说明参数表中的参数的类型,还必须要指出其参数名。

第二种:将成员函数直接定义在类的内部。

说明:编译器会将这些函数隐含地定义为内联成员函数。这种定义内联成员内联函数的方法没有使用关键字inline进行声明,因此称为隐式定义

第三种:在类内函数原型声明前或在类外定义成员函数前冠以关键字inline,因此称为显示定义

说明:可以在声明函数原型和定义函数时同时写inline,也可以在其中一处声明inline,效果是相同的。都能按内联函数处理 。使用inline定义内联函数时,必须将类的声明和内联成员函数的定义都放在同一个文件(或同一个头文件中),否则编译时无法进行代码置换。

4. 对象的定义及使用

4.1 对象的定义

可以用以下两种方法定义对象:

(1)在声明类的同时,直接定义对象。即直接在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如:

1
2
3
4
5
6
7
8
class Point{
public:
void setpoint(int,int);
int getx();
int gety();
private:
int x,y;
}op1,op2;

在声明类Point的同时,直接定义了对象op1,op2。

(2)声明了类之后,在使用时再定义对象。其一般形式如下:类名 对象名1,对象名2,..... ;

例如Point op1,op2;

4.2 对象中成员的访问

不论是数据成员,还是函数成员,只要是公有的,在类的外部可以通过类的对象进行访问。访问对象中的成员通常有一下三种方法。

(1)通过对象名和对象选择符访问对象中的成员

​ 其一般形式是: 对象名.数据成员名 或者 对象名.成员函数名[(实参表)]

​ 说明:.叫做对象选择符,简称点运算符

(2)通过指向对象的指针访问对象中的成员

​ 在定义对象时,若我们定义的是指向此对象的指针,则访问此对象的成员时,不能用.操作符,而应该使用->操作符。例如:

1
2
3
4
5
6
7
8
class Date{
public:
int year;
};
...
Date d,*ptr;
ptr=&d;
cout<<ptr->year;

在此,ptr->year表示ptr当前指向对象中d中的成员year,因为(*ptr)就是对象d(*ptr).year表示的也就是对象d中的成员year。所以有如下等价关系:

图1

(3)通过对象的引用访问对象中的成员

​ 如果为了一个对象定义了一个引用,也就是为这个对象起了一个别名、因此完全可以通过引用来访问对象中的成员,其方法与通过对象名来访问对象中的成员是相同的。例如:

1
2
3
4
5
6
7
8
9
class Date{
public:
int year;
};
...
Date d1;
Date &d2=d1;
cout<<d1.year;
cout<<d2.year;

由于d2是d1的引用(即d2和d1占有相同的存储单),因此d2.year和d1.year是相同的。

-------------The End-------------
0%