===============================================
转载时请表明出处: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所确定的对象大小(长度)是该具体对象的内存栈区空间的长度而不包括其它内存空间。
对象的长度一般是其最长数据成员长度的整数倍。如果对象是空的,则系统为它分配一个字节的空间。
转载时请表明出处: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++主流预处理,编译和链接过程
2011-09-11 13:26 10592在C++的程序的编写过程 ... -
c++ 一个简单的链表
2011-09-11 13:13 99581 #include <stdio.h> 2 # ... -
【2011.8.2】<C++学习笔记>预处理功能
2011-08-03 12:18 1495预处理功能介绍 ... -
C++经典电子资料下载合集
2011-07-11 11:43 36581.C++ 逆向工程 pdf高清下 ... -
《C++学习笔记》静态数据成员
2011-05-20 13:15 1123=============================== ... -
《C++学习笔记》不同数据类型对象的构造函数和析构函数的调用顺序
2011-05-19 01:34 1349=============================== ... -
《C++学习笔记》子对象构造函数和析构函数的调用顺序
2011-05-19 01:34 1513=============================== ... -
《C++学习笔记》子对象的初始化
2011-05-19 01:33 1732=============================== ... -
《C++学习笔记》特定类型数据成员的初始化
2011-05-17 10:56 1293========== ... -
《C++学习笔记》析构函数(destructor)
2011-05-17 10:55 1145=============================== ... -
《C++学习笔记》对象间非静态数据成员的复制
2011-05-16 12:04 1011=============================== ... -
《C++学习笔记》带缺省参数的构造函数(constructor with default arguments)
2011-05-16 12:03 2698=============================== ... -
《C++学习笔记》构造函数及特点
2011-05-16 12:02 1306========== ... -
《C++学习笔记》【封装性】类的接口部分与实现部分的分离
2011-05-16 11:41 1633========== ... -
《C++学习笔记》【封装性】成员函数的说明和定义
2011-05-16 11:37 951成员函数可在类体之内、也可在类体之外被定义。规范的做法是将成员 ... -
《C++学习笔记》【封装】封装性
2011-05-16 11:35 714以下程序依靠封装,能 ...
相关推荐
【C++ 学习笔记】深入理解编程与C++基础 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统以及许多高性能应用。学习C++不仅仅是掌握语法,更重要的是理解编程的核心概念,以便更好...
【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...
- 不同类对象的数据成员是独立存储的,但成员函数是共享的。 2. **隐式指针this**: - 当对象调用成员函数时,系统会隐式地传递一个指针`this`,指向当前对象。 - `this`指针使得不同对象能够正确调用自己的成员...
### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...
【C++学习笔记源代码】是一份集合了多个学习阶段的C++编程实践资料,适合初学者和进阶者深入理解和掌握C++语言。这份压缩包包含了一系列的子文件,如uc1.zip、uc3.zip、day15.zip等,分别对应不同的学习单元或课程...
以上就是“面向对象程序设计C++听课笔记”的主要内容,涵盖了C++中的核心面向对象概念及其在实践中的应用,对学习和理解C++编程有着重要的指导意义。通过深入学习和实践,可以提升软件开发的能力,更好地应对复杂的...
这份"C++学习笔记、心得"涵盖了从基础语法到面向对象编程的概念,是作者一个半月辛勤学习的结晶。在这里,我们将深入探讨其中可能包含的知识点,并提供一些理解和应用C++的关键指导。 1. **基础语法**:C++的基础...
这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...
总结,C++学习笔记涵盖了从基础到高级的各种主题,包括面向对象编程的精髓、模板和标准库的使用、异常处理和命名空间的管理,以及C++11及后续标准的新特性。通过深入理解和实践这些知识点,开发者能够熟练掌握C++,...
本笔记涵盖的内容广泛,旨在帮助学生全面理解C++这门强大的编程语言。 1. **基础语法与数据类型**: - C++的基础包括变量、常量、数据类型(如int、char、float、double等),以及运算符(算术、比较、逻辑等)。...
【C++】部分涵盖了C++的核心特性,如类与对象、封装、继承、多态性,以及模板和异常处理。学习者将了解到如何使用C++构建复杂的软件系统,并通过实例了解STL(Standard Template Library)中的容器、迭代器和算法。 ...
C-C++基础学习笔记是编程初学者的重要参考资料,它们涵盖了C和C++语言的基本概念、语法和编程技巧。以下是对这些知识点的详细说明: 1. **C语言基础**:C语言是一门强大的低级编程语言,它以简洁、高效著称。学习...
本学习笔记主要涵盖了C++中的几个关键主题:线程、指针、调试以及编码实践。 首先,关于C++的线程:在多核处理器的时代,线程成为了实现并行处理和提高程序性能的重要手段。C++11引入了标准库中的`<thread>`,使得...
C++是一种强大的、通用的编程语言,以其高效性、灵活性和面向对象的特性而闻名。这份"C++基础笔记资料.zip"包含的资源是学习C++基础知识的重要参考资料,适合初学者和有一定经验的开发者用来巩固基础。 C++起源于...
本篇笔记主要探讨了C++程序在内存中的存储方式,即内存分区模型,包括代码区、全局区、栈区和堆区。 1. **内存分区模型** - **代码区**:存放编译后的二进制代码,由操作系统管理,具有共享和只读属性,确保程序...
这只是C++学习笔记的冰山一角,深入学习还将涉及类、对象、派生类、构造函数、析构函数、运算符重载、模板、预处理指令、容器、函数指针、函数对象以及Lambda表达式等。面向对象编程是C++的核心特性,包括封装、继承...
这份"C++个人笔记总结"涵盖了C++语言的基础知识、核心概念以及高级特性,旨在帮助学习者深入理解并掌握C++。 一、C++基础知识 1. 变量与数据类型:C++支持基本数据类型,如int、float、char等,以及复合数据类型...
1. 类与对象:C++的核心是面向对象编程,类是对象的蓝图,通过定义类可以封装数据和函数,实现数据隐藏和抽象。文件C++(day03).txt可能详细讲解了类的定义、构造函数、析构函数以及成员函数的使用。 2. 继承与多态...
这份“C++中级学习笔记”旨在帮助已经掌握了C++基础知识的学习者进一步提升技能,掌握更高级的概念和技术。 1. **面向对象编程(OOP)基础**: C++的核心特性之一是面向对象编程。在中级阶段,你需要理解类(class)、...