C++之类与对象(3)
http://www.cnblogs.com/CaiNiaoZJ/archive/2011/07/29/2121528.html
在上篇的最后的实例程序代码中,我所写的成员函数中的参数变量名和数据成员名一样,为了编译时不发生错误,我在数据成员的前面加上"类名::"以区分。其实还有另外一种方法可以来加以区分,那就是C++中的自引用指针this。今天就讲一下C++中的this以及string类。可能代码不会很多,但突出原理;
1.this这个关键字其实对于我来说并不陌生,在C#中就常用到。但今天我想说说为什么要有this,this起到什么作用?话还是要从类和对象说起,大家都知道定义一个对象,系统要给该对象分配存储空间,如果该类包含了数据成员和成员函数,就要分别给数据和函数的代码分配存储空间。按照正常额思路,如果类定义了2个对象,那么就应该分别给这2个对象的数据和函数分配空间。但事实并非如此,C++的编译系统只用了一段空间来存放在各个共同的函数代码段,在调用各个对象的成员函数时,都与调用这个公共的函数代码。因此,每个对象的存储空间都只是该对象数据成员所占用的存储空间,而不包括成员函数代码所占有的空间,函数代码是存储在对象空间之外的。但是问题就出来了,既然所有对象所调用的成员函数代码只是单独一封,那么成员函数是怎么知道当前调用自己的是哪一个对象呢?
这时就诞生了this这个玩意,它是一个自引用的指针。每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值为当前调用成员函数的对象的起始地址。每当调用一个成员函数时,系统就把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数的this指针所指向的对象来确定应该调用哪一个对象的数据成员。通过下面一个简单实例就可说明。
#include "stdafx.h"
#include <iostream>
#include <string>
class Num
{
private:
int a;
std::string objectName;
public:
Num(std::string objectName,int a);
void showNum();
};
Num::Num(std::string objectName,int a)
{
this->objectName=objectName;
this->a=a;
}
void Num::showNum()
{
std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
}
int main()
{
Num num1("num1",1);
Num num2("num2",2);
Num num3("num3",3);
num1.showNum();
num2.showNum();
num3.showNum();
return0;
}
2.在前几篇的代码中,我都是用Char *字符串指针来定义字符变量,还有就是在上一篇中的Kid类中的构造函数,用到过字符数组。并用字符复制函数strcpy,从中出现了问题,后来在博友的帮助下解决了。strcpy、strcat(字符串连接)和字符串长度(strlen),都是C中标准库函数的字符串操作。C++保留了这种格式,但是这种方法使用起来不太方便,另外数据与处理数据的函数相分离也不符合面向对象的思想。于是C++的标准库中,就出现了字符串类string。在使用string类型时,要在头文件中加入#include<string>;string的用法我在上述的例子中也有用到。在比如:string str("Hello C++")或string str="Hello C++";同时,也可以在表达式中把string对象和以' '结束符混在一起使用。
3.最后来列个表说明一下string中常用的运算符: