C++之类与对象(3)

来源:互联网 时间:1970-01-01

在上篇的最后的实例程序代码中,我所写的成员函数中的参数变量名和数据成员名一样,为了编译时不发生错误,我在数据成员的前面加上"类名::"以区分。其实还有另外一种方法可以来加以区分,那就是C++中的自引用指针this。今天就讲一下C++中的this以及string类。可能代码不会很多,但突出原理;

1.this这个关键字其实对于我来说并不陌生,在C#中就常用到。但今天我想说说为什么要有this,this起到什么作用?话还是要从类和对象说起,大家都知道定义一个对象,系统要给该对象分配存储空间,如果该类包含了数据成员和成员函数,就要分别给数据和函数的代码分配存储空间。按照正常额思路,如果类定义了2个对象,那么就应该分别给这2个对象的数据和函数分配空间。但事实并非如此,C++的编译系统只用了一段空间来存放在各个共同的函数代码段,在调用各个对象的成员函数时,都与调用这个公共的函数代码。因此,每个对象的存储空间都只是该对象数据成员所占用的存储空间,而不包括成员函数代码所占有的空间,函数代码是存储在对象空间之外的。但是问题就出来了,既然所有对象所调用的成员函数代码只是单独一封,那么成员函数是怎么知道当前调用自己的是哪一个对象呢?

这时就诞生了this这个玩意,它是一个自引用的指针。每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值为当前调用成员函数的对象的起始地址。每当调用一个成员函数时,系统就把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数的this指针所指向的对象来确定应该调用哪一个对象的数据成员。通过下面一个简单实例就可说明。

 1 #include "stdafx.h"
2 #include <iostream>
3 #include <string>
4
5
6 class Num
7 {
8 private:
9 int a;
10 std::string objectName;
11 public:
12 Num(std::string objectName,int a);
13 void showNum();
14 };
15
16 Num::Num(std::string objectName,int a)
17 {
18 this->objectName=objectName;
19 this->a=a;
20 }
21
22 void Num::showNum()
23 {
24 std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
25 }
26
27
28 int main()
29 {
30 Num num1("num1",1);
31 Num num2("num2",2);
32 Num num3("num3",3);
33
34 num1.showNum();
35 num2.showNum();
36 num3.showNum();
37
38 return 0;
39 }

结果:

2.在前几篇的代码中,我都是用Char *字符串指针来定义字符变量,还有就是在上一篇中的Kid类中的构造函数,用到过字符数组。并用字符复制函数strcpy,从中出现了问题,后来在博友的帮助下解决了。strcpy、strcat(字符串连接)和字符串长度(strlen),都是C中标准库函数的字符串操作。C++保留了这种格式,但是这种方法使用起来不太方便,另外数据与处理数据的函数相分离也不符合面向对象的思想。于是C++的标准库中,就出现了字符串类string。在使用string类型时,要在头文件中加入#include<string>;string的用法我在上述的例子中也有用到。在比如:string str("Hello C++")或string str="Hello C++";同时,也可以在表达式中把string对象和以'/0'结束符混在一起使用。

3.最后来列个表说明一下string中常用的运算符:


相关阅读:
Top