首页 > 编程语言 >C++类模型漫谈(一)

C++类模型漫谈(一)

时间:2022-10-18 18:36:23浏览次数:47  
标签:obj 对象 模型 漫谈 TypeA C++ TypeB int 赋值

系统基于32位,MSVC编译器,VS开发工具

1、一个简单的类型TypeA,类型对象a_obj总共占8个字节。char类型a1占1个字节,但是为了考虑到32位系统存储效率,所以a1变量后面会分配3个字节,用于内存的4字节对齐。

a2变量占用4个字节,对象a_obj的地址等于a1的地址。成员函数TypeA::TypeA_Method不占用该对象的内存空间。

class TypeA {
public:
	char a1 = 10;
	int a2 = 20;
	void TypeA_Method() {}
};
int main()
{   
	TypeA a_obj;
	cout << sizeof(a_obj) << endl;//输出8
	return 1;
}

2、从TypeA类型继承一个派生类TypeB,这时TypeB的对象b_obj不仅包含了自己的成员变量b1、b2还包含了继承而来的TypeA成员a1、a2。TypeA子对象部分排在前面低地址处,对象b_ob的地址等于a1的地址

因为包含了继承而来的TypeA部分,所以b_obj总共占16个字节。

class TypeA {
public:
	char a1 = 10;
	int a2 = 20;
	void TypeA_Method() {}
};
class TypeB:public TypeA{
public:
	char b1 = 30;
	int b2 = 40;
	void TypeB_Method() {}
};
int main()
{   
	TypeA a_obj;
	cout << sizeof(a_obj) << endl;//输出8
	TypeB b_obj;
	cout << sizeof(b_obj) << endl;//输出16
	return 1;
}

3、把上面2个不同类型的对象相互赋值,因为TypeB继承自TypeA,所以TypeB内存空间是是大于等于TypeA的,所以把TypeB类型对象赋值给TypeA类型对象不会出任何问题,反过来就不行。

当然当你写a_obj=b_obj的时候,编译器通常会生成一个赋值构造函数,函数里面会将b_obj的TypeA基类子对象部分数据复制给a_obj

int main()
{   
    TypeA a_obj;
    TypeB b_obj;

    a_obj = b_obj;//把派生类b_obj对象赋值给基类a_obj对象
    b_obj = a_obj;//把基类a_obj对象赋值给派生类b_obj对象(错误)
   
    return 1;
}
 

4、把两个类型对象的指针,互相赋值,赋值的是一个地址,转换成相应类型的指针,指向不同的内存空间。因为TypeB是继承自TypeA,b_obj空间自然大于等于a_obj,这样将&b_obj赋值给a_ptr不会有问题。

反过来的赋值,则只能通过强制类型转换,而且不保证安全。

int main()
{   

	TypeA a_obj;
	TypeB b_obj;

	TypeA* a_ptr = &b_obj;//把派生类b_obj的指针赋值给TypeA*类型指针a_ptr
	TypeB* b_ptr = (TypeB*)&a_obj;//把基类a_obj的指针强制赋值给TypeB*类型指针b_ptr

	return 1;

}

 

标签:obj,对象,模型,漫谈,TypeA,C++,TypeB,int,赋值
From: https://www.cnblogs.com/fuyun2000/p/16802044.html

相关文章

  • C++中pair的用法
    https://blog.csdn.net/EmSoftEn/article/details/50587276?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ER......
  • 建立KS评估模型
    导入资源包fromsklearn.linear_modelimportLogisticRegressionimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsim......
  • Dubbo——Dubbo中的URL统一资源模型与Dubbo协议
    一、URL简介在互联网领域,每个信息资源都有统一的且在网上唯一的地址,该地址就叫URL(UniformResourceLocator,统一资源定位符),它是互联网的统一资源定位标志,也就是指网络地址......
  • 算法测试-定义算法模型评测标准
    测试方案将产品方期望转化为约束条件约定通过测试的标准:一定数据的算法结果中能满足约束条件的最低比例准备测试数据,统计计算结果能达到各项约束条件的比例示例具......
  • java DFA算法模型
    importjava.util.HashMap;importjava.util.HashSet;importjava.util.Map;importjava.util.Set;/***敏感词过滤器*/publicclassSensitive{/**敏......
  • mmdetection测试模型指标(输出每个类别的误检率、漏检率、正确率)
    #!/usr/bin/envpython#-*-coding:utf-8-*-#file:model_test1.py#@author:jory.d#@contact:#@time:2022/01/0722:41#@desc:模型测试,查看误检和漏检......
  • 生成式模型 vs 判别式模型
    生成式模型和判别式模型的概念是机器学习领域非常重要的基础知识,但能准确区分开二者并不是一件非常容易的事情,笔者经常是看一遍忘一遍,为了巩固下知识点,我将从以下几个方面对......
  • 使用pybind11 来实现python 调用c++
    参考https://blog.csdn.net/luolinll1212/article/details/1060619431c++实现2编写pybind11的代码#include"pybind11/pybind11.h"#include"pybind11/numpy.h"......
  • mmdetection 生成c++ 的anchor头文件
    importosimportos.pathasospimportnumpyasnpfrommmcvimportConfigfrommmdet.modelsimportbuild_detectorimportmathimportargparseimportpickle......
  • 测开造轮子漫谈
    参考:https://mp.weixin.qq.com/s?__biz=MzkwNTI2NjAxMA==&mid=2247484083&idx=1&sn=2abc1d87e64878ed040e3f9856c4b0ac&chksm=c0fb1486f78c9d903dfcdc6a3c6adf04c42dc8e740......