欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++-变量,this指针,全局函数,成员函数,自定义数组类

程序员文章站 2023-11-09 18:17:46
区分变量属于哪个对象 + c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和类属性相同 类成员函数写const,修饰的是谁? 全局函数 pk 类成员函数 类成员函数返回指针 ......

区分变量属于哪个对象

  • c++对象管理模型初探
    • c++类对象中的成员变量和成员函数是分开存储的,c中内存四区仍然有效
    • c++编译器对普通成员函数的内部处理(隐藏this指针)
    • this指针解决函数形参和类属性相同
    • 类成员函数写const,修饰的是谁?
    • 全局函数 pk 类成员函数
    • 类成员函数返回指针 和 返回引用
  • c++类对象中的成员变量和成员函数是分开存储的,c中内存四区仍然有效
  • c++编译器对普通成员函数的内部处理(隐藏this指针)
  • this指针解决函数形参和类属性相同
  • 类成员函数写const,修饰的是谁?
  • 全局函数 pk 类成员函数
  • 类成员函数返回指针 和 返回引用
#define _crt_secure_no_warnings
#include <iostream>


using namespace std;

class test
{
public:
    test(int i)
    {
        mi = i;
    }

    int geti()
    {
        //this就是指向调用改成员函数方法的对象地址
        return this->mi;
        //return mi;
    }
private:
    int mi;
};

/*
struct test
{
    int mi;
};

void test_init(test *pthis, int i)
{
    pthis->mi = i;
}

int geti(struct test *pthis)
{
    return pthis->mi;
}
*/
int main(void)
{

    test t1(10);//test(&t1, 10)
    test t2(20);

    t1.geti();// geti(&t1)
    
    return 0;
}

 this指针

#define _crt_secure_no_warnings
#include <iostream>


using namespace std;

class test
{
public:
    test(int k)
    {
        this->m_k = k;
    }

    int getk()  const//成员函数尾部出现const 修饰是this指针
    {
        //this->m_k = 100; //this指针不是 const test *
        //this++;// this指针是一个常指针, test *const  
        //this->m_k = 100;
        //this = this + 1;
        return this->m_k;
    }

    //static成员函数,只能返回static成员变量
    static int s_getk()
    {
        //return m_k;
        return s_k;
    }
private:
    int m_k;
    static int s_k;
};

int test::s_k = 0;


int main(void)
{
    test t1(10); //test(&t1, 10);
    test t2(20);


    return 0;
}

全局函数和成员函数

如果想返回一个对象的本身,在成员方法中,用*this返回
}

#define _crt_secure_no_warnings
#include <iostream>


using namespace std;

class test
{
public:
    test(int a, int b)
    {
        this->a = a;
        this->b = b;
    }

    void printt()
    {
        cout << "a = " << this->a << ", b=" << this->b << endl;
    }

    int geta()
    {
        return this->a;
    }

    int getb()
    {
        return this->b;
    }

    //成员方法
    test testadd(test &another)
    {
        test temp(this->a + another.a,this->b + another.b);

        return temp;
    }

    //+= 方法
    test& testadd2(test &another)
    {
        this->a += another.a;
        this->b += another.b;

        //this===>&t1
            
        return *this;//如果想返回一个对象的本身,在成员方法中,用*this返回
    }

private:
    int a;
    int b;
};


/*
//1 在全局提供一个两个test想加的函数
test testadd(test &t1, test &t2)
{
    test temp(t1.geta() + t2.geta(), t1.getb() + t2.getb());

    return temp;
}
*/

int main(void)
{
    test t1(10, 20);
    test t2(100, 200);

    //test t3 = testadd(t1, t2);
    test t3 = t1.testadd(t2);

    t3.printt();


    //((t1 += t2) += t2 )+= t2

    //如果相对一个对象连续调用成员方法,每次都会改变对象本身,成员方法需要返回引用。
    t1.testadd2(t2).testadd2(t2);

    t1.printt();

    return 0;
}

自定义数组类

main.cpp

#define _crt_secure_no_warnings
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include "myarray.h"

using namespace std;

int main(void)
{

    myarray array1(10);//开辟10元素的数组

    //赋值操作
    for (int i = 0; i < 10; i++) {
        array1.setdata(i, i + 10);
    }

    cout << "--------" << endl;

    cout << "array1:" << endl;
    for (int i = 0; i < 10; i++) {
        cout << array1.getdata(i) << " ";
    }
    cout << endl;

    myarray array2 = array1;
    cout << "array2:" << endl;
    for (int i = 0; i < array2.getlen(); i++) {
        cout << array2.getdata(i) << " ";
    }
    cout << endl;

    myarray array3;
    array3 = array1;


    cout << "array3:" << endl;
    for (int i = 0; i < array3.getlen(); i++) {
        cout << array3.getdata(i) << " ";
    }
    cout << endl;

    return 0;
}

array.h

#pragma once
#include <iostream>

using namespace std;

class myarray
{
public:
    myarray();
    myarray(int len);
    myarray(const myarray &another);
    ~myarray();

    void setdata(int index, int data);
    int getdata(int index);
    int getlen();

    void operator=(const myarray& another);
private:
    int len;
    int *space;
};



array.cpp

#include "myarray.h"


myarray::myarray()
{
    cout << "myarray()..." << endl;
    this->len = 0;
    this->space = null;
}

myarray::myarray(int len)
{
    if (len <= 0) {
        this->len = 0;
        return;
    }
    else {
        this->len = len;

        //给space开辟空间
        this->space = new int[this->len];
        cout << "myarray::myarray(int len) ..." << endl;
    }
}
myarray::myarray(const myarray &another)
{
    if (another.len >= 0) {
        this->len = another.len;

        //深拷贝
        this->space = new int[this->len];
        for (int i = 0; i < this->len; i++) {
            this->space[i] = another.space[i];
        }
        cout << "myarray::myarray(const myarray &another) ..." << endl;

    }
}
myarray::~myarray()
{
    if (this->space != null) {
        delete[]this->space;
        this->space = null;
        len = 0;
        cout << "myarray::~myarray() ..." << endl;
    }
}

void myarray::setdata(int index, int data)
{
    if (this->space != null) {
        this->space[index] = data;
    }
}
int myarray::getdata(int index)
{
    return this->space[index];
}
int myarray::getlen()
{
    return this->len;
}

void myarray::operator=(const myarray& another)
{
    if (another.len >= 0) {
        this->len = another.len;

        //深拷贝
        this->space = new int[this->len];
        for (int i = 0; i < this->len; i++) {
            this->space[i] = another.space[i];
        }
        cout << "myarray::operator=(const myarray& another) ..." << endl;

    }
}