[类和对象]3 C++面向对象模型初探
? C++编译器如何完成面向对象理论到计算机程序的转化?
[C++编译器是如何管理类、对象、类和对象之间的关系]
通过下面的代码,我们可以的得出:
C++类对象中的成员变量和成员函数是分开存储的
成员变量:
普通成员变量: 存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态成员变量: 存储于全局数据区中
成员函数: 存储于代码段中。
#include "iostream"
#include <cstdio> using namespace std; class C1
{
public:
int i; // int j; // int k; //4
protected:
private:
}; // class C2
{
public:
int i; //4 存储于对象中
int j; //4 存储于对象中
int k; //4 存储于对象中 static int m; //4 存储于全局数据区
public:
int getK() const { return k; } //4 存储于代码段中
void setK(int val) { k = val; } //4 存储于代码段中 protected:
private:
}; //12 struct S1
{
int i;
int j;
int k;
}; // struct S2
{
int i;
int j;
int k;
static int m;
}; // int main(void)
{
cout<< sizeof(C1) << endl; //
cout<< sizeof(C2) << endl; //
cout<< sizeof(S1) << endl; //
cout<< sizeof(S2) << endl; // return ;
}
c1:12
c2:12
s1:12
s2:12
? 很多对象共用一块代码?代码是如何区分具体对象的?
换句话说: int getK() const { return k; },代码是如何区分,具体obj1、 obj2、 obj3对象的k值?
面向对象的过程依旧是建立在面向过程的基础上,
比如创建了对象a,在初始化对象a的时候,就调用Tset_ininialize将a的地址[被隐藏封装]和变量10传递给函数,
如果调用函数getI()时候(对象a的数值I)时候,实际上仍然传递了对象a的地址
同样的,其他对象也是如此这样做的好处,相比C极大的提高了代码的复用性
C++普通成员函数都隐式包含一个指向当前对象的this指针,接受调用对象的地址, 静态成员函数不包含指向具体对象的指针,因为属于类的,所有对象公有的
?解释 int getK() const { return k; },
全局函数和成员函数的转换
#include <iostream>
using namespace std; class Test
{
public://成员变量
int a;
int b; public://构造函数
Test(int a = , int b = ) //使用默认参数,就可以[偷懒]使用Test t3,而不加默认参数,则必须写为Test t3(1,2);
{
cout<<"构造函数自动被调用\r\n"<<endl;
this->a = a;
this->b = b;
} Test(const Test& obj)
{
cout<<"copy函数自动被调用\r\n"<<endl;
} ~Test()
{
cout<<"析构函数\r\n"<<endl;
} public://成员函数
void printT()
{
cout<<"a:"<<a<<" b: "<<b<<endl;
} //t3 = t1.TestAdd(t2);
Test TestAdd(Test &t2)
{
Test tmp(this->a + t2.a, this->b + t2.b);
return tmp;
} //t1.TestAdd2(t2); 目的是把 t1 = t1 + t2
//返回一个引用 相当于 返回自身
//返回t1这个元素 this就是&t1
Test& TestAdd2(Test &t2)
{
this->a = this->a + t2.a;
this->b = this->b + t2.b; return *this; //把 *(&t1) 又回到了 t1元素
}
}; /*____________把成员函数 转成 全局函数 多了一个参数____________*/ void printT(Test *pT)
{
cout<<"成员函数 2 全局函数\r\n"<<endl;
cout<<"a:"<<pT->a<<" b: "<<pT->b<<endl;
} Test TestAdd(Test &t1, Test &t2)
{
Test tmp;
tmp.a = t1.a + t2.a;
tmp.b = t1.b + t1.b;
cout<<"全局函数 2 成员函数\r\n"<<endl;
return tmp;
}
/*________全局函数 转成 成员函数 少了一个参数______________*/ int main(void)
{
Test t1(, );
Test t2(, ); //全局函数方法
// Test t3;
// t3 = TestAdd(t1, t2);
// t3.printT(); //成员函数方法 //先把测试案例写出来
{
// 接收匿名对象方法1
Test t4 = t1.TestAdd(t2); //匿名对象直接转化成t4
t4.printT(); //接收匿名对象方法2
Test t5;
t5 = t1.TestAdd(t2); //匿名对象 赋值 给t5
t5.printT();
} //返回引用
t1.TestAdd2(t2);
t1.printT(); return ;
}
数组类封装
main.cpp
#include <iostream>
#include "MyArray.h" using namespace std; int main(int argc, char** argv) {
Array a1(); for(int i = ; i < ; i++) {
a1.setData(i, i);
}
cout<<"printf a1\r\n";
for(int i = ; i < a1.length(); i++) {
cout<< "a1.getData:"<<a1.getData(i) <<endl;
} cout<<"printf a2\r\n";
Array a2 = a1;
for(int i = ; i < a2.length(); i++) {
cout<< "a2.getData:"<<a2.getData(i) <<endl;
} cout << "Hello world!\n";
return ;
}
myarray.cpp
#include "MyArray.h"
//int m_length;
//int *m_space;
Array::Array(int length)
{
if (length < )
{
length = ; //
} m_length = length;
m_space = new int[m_length];
} //Array a2 = a1;
Array::Array(const Array& obj)
{
this->m_length = obj.m_length;
this->m_space = new int[this->m_length]; //分配内存空间 for (int i=; i<m_length; i++) //数组元素复制
{
this->m_space[i] = obj.m_space[i];
}
} Array::~Array()
{
if (m_space != NULL)
{
delete[] m_space;
m_space = NULL;
m_length = -;
}
} //a1.setData(i, i);
void Array::setData(int index, int valude)
{
m_space[index] = valude;
} int Array::getData(int index)
{
return m_space[index];
} int Array::length()
{
return m_length;
}
myarray.h
#pragma once #include <iostream>
using namespace std; class Array
{
public:
Array(int length);
Array(const Array& obj);
~Array(); public:
void setData(int index, int valude);
int getData(int index);
int length(); private:
int m_length;
int *m_space;
}; //要求重载以下操作符
// [] == !=
[类和对象]3 C++面向对象模型初探的更多相关文章
- C++复习:类和对象
类和对象 基本概念 1)类.对象.成员变量.成员函数 2)面向对象三大概念 封装.继承.多态 3)编程实践 类的定义和对象的定义,对象的使用 求圆形的面积 定义Teacher类 ...
- java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列
1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- js面向(基于)对象编程—类(原型对象)与对象
JS分三个部分: 1. ECMAScript标准--基础语法 2. DOM Document Object Model 文档对象模型 3. BOM Browser Object Moldel 浏览 ...
- JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等
一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...
- 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;
面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...
- c++面向过程和面向对象-C++编译器是如何管理类和对象的
1,c++编译时如何区分对象调用类的方法? C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
随机推荐
- BFS变换素数,POJ(3126)
题目链接:http://poj.org/problem?id=3126 解题报告: #include <iostream> #include <queue> #include ...
- 八数码(map版)
八数码 map真是个奇技淫巧好东西 可以十分简单的实现hash,当然速度就不敢保证了 因为九位数不算很大,完全可以用int存下,所以便将八数码的图像转换成一个int型的数字 #include<i ...
- 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
第44章 MPU6050传感器—姿态检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- BIO与NIO
BIO与NIO 1.传统BIO (1)特点 面向数据流 阻塞式传输 一个客户端对应一个线程 在客户机增多的情况下,线程资源随之增多,会造成cpu资源枯竭 (2)需求 客户机向服务器输出字符串,逐一 ...
- SpringBoot学习11:springboot异常处理方式1(自定义异常页面)
SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制.一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求.在 sprin ...
- C#如何使用异步编程【BeginInvoke/EndInvoke】
怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种 ...
- spring cloud 学习之服务消费者(rest+ribbon)
学习自 http://blog.csdn.net/forezp/article/details/81040946 方志朋的博客 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...
- CentOS7密码忘记解决方法&&GRUB菜单加密
CentOS7的root密码忘记怎么办 注意:该方法只适用于Linux7版本,可以用cat /redhat-release 查看 这里这里只介绍一种方法 1.启动的时候,在启动界面,相应启动项,内核名 ...
- uplift model学习笔记
一.解决的问题: 通常的 Propensity Model 和 Response Model 只是给目标用户打了个分,并没有确保模型的结果可以使得活动的提升最大化:它没有告诉市场营销人员,哪个用户最有 ...
- 【jQuery】阶段(插入、复制、替换、删除)
<p>你好!</p> 你最喜欢的水果是? <ul> <li title="苹果">苹果</li> <li titl ...