this指针和构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this指针和构造函数相关的知识,希望对你有一定的参考价值。

构造函数:

 特性:

1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。

2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的。

3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。

4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略。

5.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,编译器会为其自动生成一个默认的无参的构造函数。

作用:

  1. 构建对象

  2. 初始化对象

  3. 类型转换


    构造函数定义格式为:

    class <类名>

    {

    public:

    <类名>(参数表)


    };

    <类名>::<函数名>(参数表)

    {

    //函数体

    }

    如以下定义是合法的:

    class T

    {

    public:

    T(int a=0){i=a;}//构造函数允许直接写在类定义内,也允许有参数表。

    private:int i;

    };


指针:

  1. 用处:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

    2. this只能在成员函数中使用。
    全局函数,静态函数都不能使用this。
    实际上,成员函数默认第一个参数为T* const register this。
    如:
    class A{public: int func(int p){}};
    其中,func的原型在编译器看来应该是: int func(A* const register this, int p);
    由此可见,this在成员函数的开始前构造的,在成员的结束后清除。
    这个生命周期同任一个函数的参数是一样的,没有任何区别。
    当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
    A a;
    a.func(10);
    此处,编译器将会编译成: A::func(&a, 10);

关于this 指针这里有一个问题,this指针如何传递给类中函数的?

this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。


本文出自 “岁月静好” 博客,请务必保留此出处http://01160529.blog.51cto.com/11479142/1856931

以上是关于this指针和构造函数的主要内容,如果未能解决你的问题,请参考以下文章

07. this指针,构造和析构,new和delete

this指针和构造函数

虚函数和基类中的this指针的问题!

求解惑:关于多线程并发环境下构造函数的线程安全

无法解析片段中的 ViewModelProvider 构造?

如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们