首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

【笔记】C++ 类与对象

作者:  时间: 2011-06-05

  类是现实世界中客观事物的抽象,即将具有相似静态属性和动态行为的对象集合归纳为一个类。类和对象是面向对象技术的核心。

1.1 类的声明与定义

类的声明形式:

1 class<自定义类类型名>
2 {
3 [public:]
4 [<共有成员说明表>]
5 [private:]
6 [<私有成员说明表>]
7 };

类的定义

成员函数的定义形式如下:

1 <函数类型><类名>::<函数名>(<形参数表>)
2 {
3 函数体
4 }

成员函数还可以再类中定义。

1.2 对象

对象的声明

  声明对象的过程叫做类的实例化。先定义类类型,然后声明类对象的一般形式为:  类名  对象名表;

类成员的访问

  在类体外,类成员的访问形式为:

  <对象名>.成员名     或者     <指向对象的指针名>->成员名 

如:

1 Date date1,date2;
2 Date *pDate = &date2;
3
4 date1.SetDate(...);    //方式1
5 pDate ->SetDate(...);    //方式2

类成员的访问控制

  C++通过三个关键字public(公有)、private(私有)、protectd(保护)、来指定类成员的访问限制。

◆公有成员:在程序的任何地方都可以访问。一般限制在成员函数上,使其作为类与外界的接口,通过国它来操作类的对象。

◆私有成员:只能被该类的成员函数或该类的友元访问。

◆保护成员:只能在该类的内部或其派生类类题中使用。

  类与结构体的区别:类默认的访问控制类型是private,而结构体默认的访问控制类型是public。

1.3 构造函数和析构函数

1.3.1 构造函数

  在C++中,对象的初始化工作是由构造函数来完成的。构造函数是一种特殊的成员函数。

构造函数的特征:

  ①构造函数名与类名相同。

  ②无任何函数返回类型说明。

  ③一个新的对象被创建时,构造函数被编译系统自动调用,完成初始化工作。

  ④如果在类中没有给出构造函数,系统给出一个默认的无参构造函数。

  ⑤构造函数可以重载。

1.3.2 析构函数

  在构造函数中使用new分配了内存空间,当注销对象时,需要使用delete将动态分配的空间释放。这部分工作可以放在析构函数中。

  析构函数是一个特殊的公有成员函数,特点如下:

  ①析构函数名为:  ~<类名>。

  ②无任何函数返回类型说明。

  ③析构函数无参数,所以不能被重载。

  ④如果在类中没有给出析构函数,系统给出一个默认的析构函数。

  ⑤当用delete释放动态对象时,系统自动调用析构函数完成对象撤销前的处理。

1.4 类的静态成员 

  在类的成员前加关键字static,这种成员就是类的静态成员。类的静态成员的特点是:静态成员属于类,不属于任何对象。静态成员只有一份存于公有内存中,被该类的所有对象共享。

1.4.1 静态数据成员 

  需要在类外对静态数据成员进行定义。定义如下:    <类型><类名>::<静态数据成员名>[=<初值>];

如:    double  Account::m_rate=0.098;  

注:静态数据成员定义时前不要加关键字static。且只能定义一次。

  类的静态数据成员不属于任何类,类的公有静态数据成员的一般访问形式为:

  <类名>::<静态数据成员名>   或者   <对象名>.<静态数据成员名>   或者  <对象指针>-><静态数据成员名>

  如果静态数据成员是私有的,就只能使用静态成员函数来间接访问静态数据成员。

1.4.2 静态数据成员

  对类的静态成员函数的调用形式为:   <类名>::<静态成员函数调用>

1.5 友元

  在程序中,如果普通函数或另一个类中的函数需要经常通过类听过的公有接口来访问类的私有成员或保护成员,为了提高程序运行的效率,可以将它们声明为类的友元,它们就能直接访问类的任何成员啦。友元提供了一般函数与类的成员之间、不同类的成员之间进行数据共享的机制。

  用friend关键字可以声明3类友元:

(1)友元函数

  将一个普通函数声明为类的友元函数的形式为:  friend<数据类型><友元函数名>(参数表)

例如:fun函数声明为A类的友元函数,声明后,fun函数有权访问A类中的任何成员,包括私有成员和保护成员。

1 class A
2 {
3 ...
4 friend int fun(int x);
5 ...
6 }

(2)友元成员

  将一个类的成员函数声明为另一个类的友元函数,就是友元成员。声明友元成员的形式为:   friend <类型><含有友元成员的类名>::<友元成员名>(参数表);

例如:A类中的成员函数有权访问B类中的任何成员,包括私有成员和保护成员。

1 class A
2 {
3 ...
4 int fun(int x);
5 ...
6 }
7  class B
8 {
9 ...
10 friend int A::fun(int x);
11 ...
12 }

(3)友元类

  将一个类声明为另一个类的友元类的语法形式为:   friend<友类名>;   或者     friend class <友类名>;

例如:A类的任何成员函数都有权访问B类中的任何成员,包括私有成员和保护成员。

1 class B
2 {
3 ...
4 friend class A
5 ...
6 }

1.6 this指针

  每个类成员函数都含有一个指向被调用对象的指针,这就是this指针。this指针是一个隐含于每一个非静态成员函数中的特殊指针,就是成员函数的一个类指针类型的形参。

  由于有了this指针的存在,使得类中相同的成员函数会根据this指针指向对象的不同而操作不同对象的数据成员。

  类的静态成员函数没有this指针。这是因为静态成员函数为类的所有对象所共有,不属于某一个对象。

显式使用this指针的两种情况:

(1)在类的非静态成员函数中返回类对象本身的时候,直接使用“return *this”。

(2)当参数和成员变量名相同时。

1.7 string类

  C++标准程序库中提供了一个string类,专门用来处理字符串操作。使用string类,必须在程序中包含头文件string(不是string.h,它是C字符串头文件)。

1.7.1 string类对象的初始化

  string类的构造函数包括:

View Code
1 string();
2  string(const char *s);将string初始为一个由s指向的字符串,以'\0'作为结束标识符
3  string(size_type n,char c);n个元素,每个元素都是c
4  string(const sring &str,size_type n=npos);
5  string(const char *s,size_type n);
...

1.7.2 string类操作

View Code
1 =,assign();
2 swap();
3  +=,append(),push_back();
4 insert();
5 erase();
6 clear();
7 replace();
8  +;
9  ==,!=,<,<=,>,>=,compare();
10 size(),length();
11 max_size();
12 empty();
13 capacity();
14 reserve();
15 [ ],at();
16  >>,getline();读出
17  <<;写入
18 copy();
19 c_str();
20 data();
21 substr();
22 find();

今天指针的学习就到这里了。