`

《C++学习笔记》【封装性】对象及其内存存储内容

    博客分类:
  • C++
阅读更多
===============================================
转载时请表明出处:http://www.cofftech.com/thread-1389-1-1.html
===============================================
面向对象的方法以对象为中心和出发点。对象可以是某一类概念实体的实例,也可以是现实生活中的一个物理实体。
    在上一节的类class integ的定义中,数据成员int j(一般情况下一个类可有多个数据成员)可以具有不同数值或不同数值的组合,可以使用各种成员函数对它进行不同操作。这种情况下,只用一个类来表达是不够的。应该为该类建立不同对象来加以表达;正如对于整型数据需要建立不同整型变量那样。例如:
int  j, k, m;       
其中j、k和m是不同整型变量,它们是整型数据类型int的不同实例;而
integ  obj1, obj2, obj3; 中的obj1、obj2和obj3则是class integ的不同对象,它们是class integ的不同实例,它们的数据成员具有不同数值组合。
此处,类是一种用户自定义的数据类型,而对象是一个类的实例。正如j、k和m是整型类(int)数据的实例一样。
建立对象的过程是类实例化(instantiation of classes)的过程。
建立对象有两种方法:
1.      定义类的同时建立对象:
class integ  {
  int j;
public:
  integ( ) { j = 6; }                       //构造函数
  int  sq();
  int  read();
} obj;
此处在定义class integ的同时也建立对象obj。
此法的缺点是所建立的对象是全局对象,从软件工程的观点看是不合适的。因此以下法为宜。
2.      常用的方法:先定义类然后再建立对象:
例如在主函数外定义或说明一个类,然后在主函数内建立对象,即:
void main( )
{
       integ  obj;
       ……
}

“封装性”的[例1]中对象obj被如下使用:
void main()
{
  integ  obj;                                          //建立对象并初始化
  cout << obj.read() << endl;          //读数据
  cout << obj.sq( ) << endl;                   //读平方值
}
/* Results:
6
36   */

其中分别读对象obj的数据成员j值以及求j的平方值。
从主函数可以看出,调用对象成员时,使用成员访问符(access operator)“ . ”。此处obj.read()和obj.integ::read( )的表达式是相同的。
对象可具有名称、指针和引用。在访问对象成员时可使用不同成员访问符。见下例。
[例1]分别使用对象的名称和指针来使用(访问)对象成员的例子
// access operators(成员访问符) . and ->
#include <iostream.h>
class Count {
public:
     int x;
     void print() { cout << x << endl; }
};
void main()
{
   Count obj,                   // create obj object
   *objPtr = &obj,           // pointer to obj
          &objRef = obj;   // reference to obj
            //使用对象名//
          obj.x = 7;       // assign 7 to data member x
          cout << "Display x using the object's name: ";
          obj.print();     // call member function print
                 //使用引用//
          objRef.x = 8;    // assign 8 to data member x
          cout << "Display x using a reference: ";
          objRef.print();
                 //使用指针//
          objPtr->x = 10;  // assign 10 to data member x
          cout << "Display x using a pointer: ";
          objPtr->print();
              //请注意:对象的指针可直接指向对象的成员
}

/* Results:
Display x using the object's name: 7
Display x using a reference: 8
Display x using a pointer: 10
*/
对象的内存数据存储空间分为两部分:即内存栈区空间以及内存数据区空间。统称为“双区存储空间”。
一个对象被建立后,绝大多数情况下被存储于内存栈区空间内。(个别情况下,如整个对象是静态的,则它被存储于内存数据区空间内)。在该内存栈区空间内存储的是该对象的非静态数据。而该类的(供所有对象所共享)静态数据则存储于内存数据区空间内。
[例2]确定对象大小和各种变量的地址
#include "iostream.h"
class base {
public:
       int x1;
       static double s;
       int inc( ) { return x1++; }
       // To show that inc( ) does not occupy space in stack area
};
double base::s = 1.1;               //类的静态数据必须说明或定义
void main()
{
              // To show an object only contains non-static datum
       cout<< "size of class base is "<< sizeof(base) << endl;
       cout<< "equal to size of an integer:"<< sizeof(int) << endl;
              //To show that static datum occupies space in data area
       cout<< "address of static base::s is "<< &base::s <<endl;
   // To show only non-static datum occupies space in stack area
       base p;
       cout<< "address of object p is "<< &p <<endl;
       cout<< "address of p.x1 is "<< &p.x1 <<endl;
}
/* Results:
size of class base is 4
equal to size of an integer:4(函数和静态数据都不在本对象内)
address of static base::s is 0x00429098(在数据区内)
address of object p is 0x0012FF7C(在栈区内)
address of p.x1 is 0x0012FF7C(在栈区的同一地址内)
*/

C++语言中对象的具体定义:
类是包含数据(属性,Attributes)和对这些数据进行操作的函数(实现,Implementation)这两部分的实体(entity)。类的实例(instance)是对象(object)。
前面提到过,一个对象被建立后,至少被存储于两个内存存储空间内。其中内存栈区空间用于存储每个对象的非静态数据;内存代码空间(代码区)用于存储类的成员函数的代码。
如果对象中包括静态数据,则它被存放在内存数据区空间内。
如果类中包括虚函数,则内存栈区空间内还存放该对象的虚指针,内存数据区空间内还存放该对象的虚地址表。
上面[例2]中的程序obj_cont_1.cpp所确定的对象大小(长度)是该具体对象的内存栈区空间的长度而不包括其它内存空间。
对象的长度一般是其最长数据成员长度的整数倍。如果对象是空的,则系统为它分配一个字节的空间。
分享到:
评论

相关推荐

    C++学习笔记.doc

    【C++ 学习笔记】深入理解编程与C++基础 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统以及许多高性能应用。学习C++不仅仅是掌握语法,更重要的是理解编程的核心概念,以便更好...

    c++学习笔记(个人学习时做的笔记)

    【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...

    C++学习笔记

    - 不同类对象的数据成员是独立存储的,但成员函数是共享的。 2. **隐式指针this**: - 当对象调用成员函数时,系统会隐式地传递一个指针`this`,指向当前对象。 - `this`指针使得不同对象能够正确调用自己的成员...

    Visual C++学习笔记

    ### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...

    c++学习笔记源代码

    【C++学习笔记源代码】是一份集合了多个学习阶段的C++编程实践资料,适合初学者和进阶者深入理解和掌握C++语言。这份压缩包包含了一系列的子文件,如uc1.zip、uc3.zip、day15.zip等,分别对应不同的学习单元或课程...

    面向对象程序设计C++听课笔记

    以上就是“面向对象程序设计C++听课笔记”的主要内容,涵盖了C++中的核心面向对象概念及其在实践中的应用,对学习和理解C++编程有着重要的指导意义。通过深入学习和实践,可以提升软件开发的能力,更好地应对复杂的...

    C++学习笔记、心得

    这份"C++学习笔记、心得"涵盖了从基础语法到面向对象编程的概念,是作者一个半月辛勤学习的结晶。在这里,我们将深入探讨其中可能包含的知识点,并提供一些理解和应用C++的关键指导。 1. **基础语法**:C++的基础...

    c++ -- stl 学习笔记

    这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...

    C++学习笔记_C++_

    总结,C++学习笔记涵盖了从基础到高级的各种主题,包括面向对象编程的精髓、模板和标准库的使用、异常处理和命名空间的管理,以及C++11及后续标准的新特性。通过深入理解和实践这些知识点,开发者能够熟练掌握C++,...

    达内C++课程笔记

    本笔记涵盖的内容广泛,旨在帮助学生全面理解C++这门强大的编程语言。 1. **基础语法与数据类型**: - C++的基础包括变量、常量、数据类型(如int、char、float、double等),以及运算符(算术、比较、逻辑等)。...

    达内c++课程笔记

    【C++】部分涵盖了C++的核心特性,如类与对象、封装、继承、多态性,以及模板和异常处理。学习者将了解到如何使用C++构建复杂的软件系统,并通过实例了解STL(Standard Template Library)中的容器、迭代器和算法。 ...

    达内C-C++基础学习笔记

    C-C++基础学习笔记是编程初学者的重要参考资料,它们涵盖了C和C++语言的基本概念、语法和编程技巧。以下是对这些知识点的详细说明: 1. **C语言基础**:C语言是一门强大的低级编程语言,它以简洁、高效著称。学习...

    c++学习笔记(c++ 线程 指针 调试 编码)

    本学习笔记主要涵盖了C++中的几个关键主题:线程、指针、调试以及编码实践。 首先,关于C++的线程:在多核处理器的时代,线程成为了实现并行处理和提高程序性能的重要手段。C++11引入了标准库中的`&lt;thread&gt;`,使得...

    C++基础笔记资料.zip

    C++是一种强大的、通用的编程语言,以其高效性、灵活性和面向对象的特性而闻名。这份"C++基础笔记资料.zip"包含的资源是学习C++基础知识的重要参考资料,适合初学者和有一定经验的开发者用来巩固基础。 C++起源于...

    C++面向对象学习笔记

    本篇笔记主要探讨了C++程序在内存中的存储方式,即内存分区模型,包括代码区、全局区、栈区和堆区。 1. **内存分区模型** - **代码区**:存放编译后的二进制代码,由操作系统管理,具有共享和只读属性,确保程序...

    C++学习笔记.pdf

    这只是C++学习笔记的冰山一角,深入学习还将涉及类、对象、派生类、构造函数、析构函数、运算符重载、模板、预处理指令、容器、函数指针、函数对象以及Lambda表达式等。面向对象编程是C++的核心特性,包括封装、继承...

    c++个人笔记总结.rar

    这份"C++个人笔记总结"涵盖了C++语言的基础知识、核心概念以及高级特性,旨在帮助学习者深入理解并掌握C++。 一、C++基础知识 1. 变量与数据类型:C++支持基本数据类型,如int、float、char等,以及复合数据类型...

    c++源码笔记_非常值得一看

    1. 类与对象:C++的核心是面向对象编程,类是对象的蓝图,通过定义类可以封装数据和函数,实现数据隐藏和抽象。文件C++(day03).txt可能详细讲解了类的定义、构造函数、析构函数以及成员函数的使用。 2. 继承与多态...

    笔记整理 C++中级学习笔记

    这份“C++中级学习笔记”旨在帮助已经掌握了C++基础知识的学习者进一步提升技能,掌握更高级的概念和技术。 1. **面向对象编程(OOP)基础**: C++的核心特性之一是面向对象编程。在中级阶段,你需要理解类(class)、...

Global site tag (gtag.js) - Google Analytics