一、心得感悟
c语言的课程学习后,开始c++的学习,首先就是学习类。在学习类时,类的使用与c语言有着极大的差别,一开始学习十分别扭。c语言的学习直接定义几个形参、函数就可以写程序了;而到了c++学习,关于类,首先必须定义类。具有相同性质和功能的东西构成的集合,通常归成一“类”。例如,“人”是类的概念。为了描述人的特点,有姓名、性别、年龄、身高、体重等特征,称为“属性”。人还有各种生活技能和工作技能,称为“方法”。类是抽象的,当属性赋给具体的值,方法有具体的内容时,才成为对象,如具体的张三、李四。对象时某个类的能动实体。
类的定义包括行为和属性两个部分,属性以数据表示,行为通过函数实现。类的实例称为对象,正如基本数据类型的实例称为变量一样,在程序设计中,“变量”与“对象”两个属于常常可以互换使用。在面向对象程序设计中,程序的基本单位时类。类时用户定义的数据和操作这些数据的函数的封装。类的对象使用自己的方法完成对数据的操作。c++中,属性用数据的储存结构实现,称为类的数据成员;方法用函数实现,称为成员函数。它们都是类的成员。使用对象包括访问对象的数据成员和调用成员函数。类中的成员函数可以使用自身不同性质的数据成员和调用成员函数。
总之,学习c++,类是最重要的,没有之一。不会定义和使用类,在今后的学习可能会寸步难行。
二、内容总结及例题与分析
1.1. 首先定义类的说明语句一般形式为:
class<类名>
{
public:
公有段数据成员和成员函数;
protected:
保护段数据成员和成员函数;
private:
私有段数据成员和成员函数;
};←分号不得省略!
类成员用关键字指定不同的访问特征,决定其在类体系中或类外的可见性。
关键字private用声明私有成员。私有成员只能在类中可见,不能在类外或派生类中使用。
protected声明保护成员。保护成员在类和它的派生类中可见。
pulibc声明共有成员。共有成员是类的接口,在类中和类外可见。
例如:
class Date
{
public:
void SetDate(int y,int m,int d);
int IsLeapYear();
void PrintDate();
private:
int year,month,day;
};
Date类有三个私有数据成员:year,month,和day。
另外,Date还有三个共有成员函数:SetDate函数是用于获取对象的值,设置日期;函数IsLeapYear用于判断是否闰年:PrintDate函数用于输出日期。在类的说明语句中没有给出函数的实现。
成员函数在类外定义使用作用域区分符进行说明,此时函数头的形式为:
返回类型 类型::函数名(参数名)
其中,作用域区分符由两个冒号构成,它用于标识属于什么类的成员。
Date类的成员函数定义在类外写为:
void Date::SetDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
int Date::IsLeapYear()
{ return(year%4==0&&year%100!=0)||(year%400==0); }
void Date::PrintDate()
{ cout<<year<<"."<<month<<"."<<day; }
简单的成员函数实现可以在类中定义,此时,编译器作为内联函数处理。例如,成员函数SetDate在类中写成:
public:
void SetDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
成员函数有两个作用:一是操作数据成员,包括访问和修改数据成员;二是用于协同不同的对象操作,称为传递消息。成员函数通过参数与其它对象协同操作。
对象是类类型的变量,说明方法与普通变量相同。对象没有成员函数的副本,类成员函数可以被对象调用。
类的数据成员除了可以是基本类型外,还可以是数组、结构、类等自定义的数据类型。如果一个类的成员是一个已经定义的类类型,则称为类的包含(或组合)。例如,定义Student类:
class Student
{ public:
char name[10];
Date birthday;
long code;
char *address;
char phone[20];
//...
};
1.2. 访问对象成员
使用对象包括访问对象的数据成员和调用成员函数。类中的成员函数可以使用自身不同性质的数据成员和调用成员函数。公用成员是提供给外部的接口,即,只有公用成员在类体系外可见。对象成员的访问形式与访问结构的形式相同,运算符“.”和“->”用于访问对象成员。
例:1.访问对象的公用成员。
#include<iostream>
using namespace std;
class Tclass
{ public:
int x,y;
void print()
{ cout<<x<<"."<<y; };
};
int main()
{
Tclass test;
test.x=100;//访问共有段数据成员
test.y=200;
test.print();//调用共用段成员函数
}
2.用指针访问对象成员。
#include<iostream>
using namespace std;
class Tclass
{ public:
int x,y;
void print()
{ cout<<x<<"."<<y; };
};
int add(Tclass *ptf)
{ return(ptf->x+ptf->y); }
int main()
{
Tclass test,*pt=&test;//说明一个对象test和对象指针pt
pt->x=100; //用对象指针访问数据成员
pt->y=200;
pt->print(); //用对象指针调用成员函数
test.x=150;
test.y=450;
test.print();
cout<<"x+y="<<add(&test)<<endl;//把对象地址传给指针参数
}
1.3.this指针
需要显式引用this指针的三种情况
(1)在类的非静态成员函数中返回类对象本身或对象的引用的时候,直接使用return *this,返回本对象的地址是,return this。
(2)当参数与成员变量名相同时,如this->x=x,不能写成x=x。
(3)避免对同一对象进行赋值操作,判断两个对象是否相同时,使用this指针。
函数返回对象的引用
#include<bits/stdc++.h>
using namespace std;
class Person
{
public:
Person(string n,int a)
{
name=n; //这里的name等价于this->name
age=a; //这里的age等价于this->age
}
int getage(void)const{return age;}
Person& addage(int i){age+=i; return *this;}
private:
string name;
int age;
};
int main()
{
Person Li("Li",20);
cout<<"Li age ="<<Li.getage()<<endl;
cout<<"Li add age ="<<Li.addage(1).getage()<<endl;//增加岁的同时,可以对新的年龄直接输出;
return 0;
}
程序执行结果为:
Li age=20