一般来说,在程序中必须使用点成员运算符“.”或者箭头成员运算符“->”,才能访问类对象的成员。其中,“.”用于类对象或引用,“->”用于指向类对象的指针,使用指针定义对象就需要使用“->”,如程序209.cpp 所示。
//案例名称:类对象成员的访问
//程序名称: 209.CPP
# include
using namespace std;
class Tdate
{
public:
void Set(int, int, int);
void Print();
int month;
int day;
int year;
};
void Tdate ::Set(int m, int d, int y)
{
month=m;
day=d;
year=y;
}
void Tdate::Print()
{
cout<Print(); //调用类的方法
}
程序解释
在类中使用 void Set(int,int,int);定义了一个成员函数的原型,语 b=&a;将 a 对象的地址赋给b,这样指针 b就指向对象a,使用 b->Print( ) ;语句将内容输出来。
C++语言通过访问限定符 public、private 和 protected 将类成员分成三类:公有成员、私有成员和保护成员。
在不考虑继承的情况下,可以认为私有成员和保护成员一样。为了防止无限制地访问,通常在私有部分声明类的数据成员,公共部分构建类对象的接口。外部(类的外边)的任何函数都可访问 public声明的数据成员和函数,只有在类的成员函数内部才可以访问 private 声明的成员。
封装性是面向对象程序三大基本特性之一。在设计类的时候,要求将数据成员定义为利有数据类型,将成员函数定义为公有的。外部函数不能直接访问数据成员,只能通过成员团数访问数据成员。以定义私有的数据成员“int month”为例,若要给“month”赋值,则要定义一个成员函数“setMonth(int m)”,注意函数名的写法,“set”后面变量的第一个字母一般为大写。如果要得到“month”的值,则定义个函数“int getMonth()”,使用方法如程序210.cpp 所示。
//案例名称:类对象成员的访问
//程序名称:210.cpp
# include
using namespace std;
class Tdate
{
private:
int month;
public:
void setMonth(int d)
{
month=d;
}
int getMonth()
{
return month;
}
};
int main()
{
Tdate * b=new Tdate();
b->setMonth(100);
cout<getMonth()<
在 C 语言中使用”malloc()”函数来申请内存 使用”free”函数来放内存。在C++语言中依然可以使用这种万法,但是不建议使用该方法。C++语言提供了new 表达式和delete表达式来申请和释放内存。
用new 表达式创建动态的类对象,它的寿命期由程序控制,定义格式为,
“new<类名[(<初始值>)];”,其中初始值是可选项,若给出了初始值,系统会自动调用相应的构造函初始化新创建的类对象,否则调用缺省构造函数进行初始化。
采用 delete 表达式释放动态类对象的格式为: delete<指针名>;”,释放动态类对象数 组的格式为:“delete[]<指针名>;”。举例如下。//整数类型指针
int *p: //整数类型指针
float *f; //浮点类型指针
p=new int; //为一个整数类型的数分配内存
f=new float; //为一个浮点类型的数分配内存
如果成功调用了new,则返回一个指向已分配空间的指针,如果此空间不可用或检测到某些错误,则返回零。为对象分配内存使用同样的语法,举例如下。
person *stu_ptri; //指向类型为 person 对象的指针
stu_ptr=new person(); //指向新的 person 对象
在类定义对象时使用 new 和 delete 的方法,如程序211.cpp所示。
//案例名称:使用 new 和 delete 的方法
//程序名称:211.cpp
#include
using namespace std;
class Tdate
{
private:
int month;
public:
void setMonth(int d)
{
month=d;
}
int getMonth()
{
return month;
}
};
int main()
{
Tdate * b=new Tdate(); //定义一个对象
b->setMonth(10);
cout<getMonth()<
程序解释
用 delete 删除一个经“malloc()”函数申请的变量会导致一个错误,用“free()”函数释放一个由 new 分配的变量也会导致一个错误。
一个由C/C++编译的程序占用的内存分为以下5个部分。
栈由系统自动分配,速度较快,但程序员是无法控制的。堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
堆和栈的区别可以用如下的比喻来说明。使用栈就像去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,好处是快捷,但是自由度小。使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦但是比较符合自己的口味,而且自由度大。