• C++之类与对象(3)


    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中常用的运算符:

  • 相关阅读:
    DVWA--SQL Injection(SQL注入)
    DVWA--Insecure CAPTCHA(不安全的验证码)
    DVWA--File Upload(文件上传)+中国菜刀下载及使用
    DWVA--File Inclusion(文件包含)
    DVWA--CSRF(跨站请求伪造)
    DVWA--Command Injection(命令行注入)
    2020.08.06【省选B组】模拟 总结
    2020.08.05【省选B组】模拟 总结
    2020.08.04【省选B组】模拟 总结
    jzoj 5251. 【GDOI2018模拟8.11】决战
  • 原文地址:https://www.cnblogs.com/honeybusybee/p/5281114.html
Copyright © 2020-2023  润新知