区分变量属于哪个对象

  • 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; }
}

c++-变量,this指针,全局函数,成员函数,自定义数组类的更多相关文章

  1. this指针和const成员函数

    1.this指针 1)this指针是成员函数的隐式参数,成员函数通过this指针来访问调用它自己的那个对象,成员函数对各成员的访问均通过this进行 2)当某个对象调用它的成员函数时,编译器会把这个对 ...

  2. c++全局函数 && 成员函数

    #include<iostream> using namespace std; class Test { public: Test(, ) { this->a = a; this-& ...

  3. this指针与const成员函数

    this指针的类型为:classType *const      // 即指向类类型非常量版本的常量指针 所以,我们不能把this绑定到一个常量对象上 ===>  不能在一个常量对象上调用普通的 ...

  4. 为什么NULL指针也能访问成员函数?(但不能访问成员变量)

    查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...

  5. C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载

    1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...

  6. C++类内存布局图(成员函数和成员变量分开讨论)

    一.成员函数 成员函数可以被看作是类作用域的全局函数,不在对象分配的空间里,只有虚函数才会在类对象里有一个指针,存放虚函数的地址等相关信息. 成员函数的地址,编译期就已确定,并静态绑定或动态的绑定在对 ...

  7. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  8. [转]成员函数指针与高性能的C++委托

    原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...

  9. 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)

    1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...

随机推荐

  1. 在vue中选中某个标签,并且对其属性进行操作

    第一步:在标签中添加ref="111"属性 第二步:this.$refs.111.属性=""   此步骤是一111为标记选中了要操作的标签,通过点属性的方法,进 ...

  2. ASP.NET Core 中的 ObjectPool 对象重用(一)

    前言 对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种 ...

  3. 程序员的算法课(3)-递归(recursion)算法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  4. centos 7 MysSQL 5.7.23 二进制安装

    MySQL 5.7.23 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...

  5. Vsftp与PAM虚拟用户

    使用yum 安装vsftp yum install vsftpd pam pam-* db4 db4-* 创建一个保存用户及密码的文件 cd /etc/vsftpd/ touch virtual_lo ...

  6. python check excel 文件

    Use pip install openpyxl first Every simple example import openpyxl # 打开excel文件,获取工作簿对象 wb = openpyx ...

  7. javascript实用Date工具

    时间字符串和年月日数据之间的自由转换工具:2018年更新版 上代码: /** * @Desc: 时间处理工具 * @Author: 拿饭盒当烟灰缸 * @Date: 2018-02-27 15:42: ...

  8. 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot

    [摘要] 微服务架构的本质在于分布式.去中心化. 随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点. 在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速 ...

  9. [Abp vNext 源码分析] - 13. 本地事件总线与分布式事件总线 (Rabbit MQ)

    一.简要介绍 ABP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装 ...

  10. js-编程练习题-输出年月日以及练习字符串分割,检索,转换整数(int)

    这是在慕课网上看到的编程题-如有侵权,请联系本人删除. 当然:题是他们的,做题是我的...嘿嘿嘿 某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分 ...