C++类对象成员的访问

一般来说,在程序中必须使用点成员运算符“.”或者箭头成员运算符“->”,才能访问类对象的成员。其中,“.”用于类对象或引用,“->”用于指向类对象的指针,使用指针定义对象就需要使用“->”,如程序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( ) ;语句将内容输出来。

2.4.4 类的访问限制

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/C++编译的程序占用的内存分为以下5个部分。

  • 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等
  • ② 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。它与数据结构中的堆是两回事,分配方式类似于链表。
  • 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
  • 文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。⑤ 程序代码区:存放函数体的二进制代码

栈由系统自动分配,速度较快,但程序员是无法控制的。堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

堆和栈的区别可以用如下的比喻来说明。使用栈就像去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,好处是快捷,但是自由度小。使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦但是比较符合自己的口味,而且自由度大。

你可能感兴趣的:(C++,c++,算法)