C++的OOP特性
内存模型和名称空间
- 存储持续性,作用域和链接性
C++有三种方案来存储数据- 自动存储持续性:在函数定义中声明的变量,包括函数参数。在函数或代码块开始执行时创建。执行完函数或者代码块,内存自动释放。
- 静态存储持续性:函数定义外定义的变量和使用关键字static定义的变量。他们在程序的整个运行过程中都存在。
- 动态存储持续性:用new分配的内存,要显式使用delte操作符释放或者程序结束,系统程序来释放。
作用域表述变量名称的可见范围。在某一范围内,变量名称不能重复。链接性描述名称如何在不同单元(通常为文件)之间进行共享。链接性为外部,则可多个文件共享。链接性为内部,则只能在一个文件中的函数共享。自动变量无链接性,则不能共享。
自动存储持续性:在默认情况下,函数中声明的函数参数和变量为自动存储持续性。作用域为局部,没有链接性。
静态持续变量有三种链接性:
- 外部链接性:在代码块外面声明它。又称为全局变量。可以多个文件分享数据。但是const 全局常量的链接性为内部链接性。因为变量有且只能有一个文件包含其定义,在其他文件使用时,使用extern关键字进行引用声明。
- 内部链接性:在代码块外面声明它,但是用static修饰。static将链接性限定为本文件,但是可以在本文件的多个函数间分享数据。其他文件用extern声明它时,编译器找不到该变量。本地的static静态变量会隐藏常规外部变量。
- 没有链接性:在代码块内部声明它,但是用static修饰。在整个程序运行期间,其内存一直存在,程序结束才会释放。而且即使函数被调用多次,其初始化语句只会执行一句。
未被初始化的静态变量的所有位都被设置为0。
C++关键字中有一些被称为存储说明符(storage class specifier)和cv-限定符的关键字。他们提供了有关数据(变量)的存储信息。
CV限定符
- const:它表明,内存被初始化后,程序便不能再对它进行修改。所以const常量声明时就必须初始化。但是const全局变量的链接性为内部的。所以可以在头文件中包含常量声明。因为在源代码文件中#include头文件后,其链接性为该文件内部。
- volatile:它修饰变量,表明即使程序代码没有对内存单元进行修改,其内存内容也可能改变。比如两个程序共享数据,指针指向某个硬件,该硬件的数据会自行改变。如果一个变量被连续几个语句使用,编译器一般会优化代码,将该数据取出后放在寄存器中参与运算。最后再一次性写回内存。对volatile变量不会如此。
存储说明符
- auto:将变量声明为自动变量。因为变量默认就为自动变量,一般不用。
- register:指出变量为寄存器存储类型。
- static:将全局变量声明为内部链接性。将局部变量声明为无链接性,且为静态持续。
- extern:表明是引用声明,声明引用在其它地方/文件中定义的变量。编译器见到此声明,去其他文件寻找变量定义。
- mutable:一般修饰结构或者类中的某个成员变量。指出即使结构或类变量为const,其中的某个成员也可以被修改。
函数也有链接性。函数的存储持续性默认为静态,链接性默认为外部,即可跨文件共享。所以在一个工程中参与编译的文件中。函数不可重名。还可以使用static修饰函数,将其链接性设置为一个文件。则不同文件中可以有同名函数。static要同时修饰原型和定义。
- 布局new操作符
- 存储持续性,作用域和链接性
对象和类
不必在类中使用关键字private。因为这是类对象的默认访问控制。
C++中的结构和类十分相像,类就像是包含成员函数以及public和private可见性标签的结构声明。实际上,它们之前的惟一区别是,结构的默认访问类型是public,而类是private。可以用类来表示纯粹的数据对象或者没有私有部分的类。
和cout一样,cerr也是一个ostream对象,两者区别在于,操作系统重定向只影响cout,而不影响cerr。所以,如果将程序输出重定向到文件,并且发生了错误,则屏幕上依然会出现错误消息。在UNIX系统中,>用于对cout进行重定向, 2>对cerr进行重定向。
类声明习惯于将短小的成员函数作为内联函数。
- 定义位于类声明中的函数都将自动成为内联函数。
- 也可以在类声明之外定义成员函数。在定义函数时用inline限定符即可。类中函数声明可不使用inline。
- 内联函数要求每个使用他们的文件中都有对其进行定义。所以常将内联定义放在定义类的头文件中。
使用构造函数的两种方式:
- 显式调用构造函数:ClassName classVar = ClassName(...)
- 隐式调用构造函数:ClassName classVar(...);
构造函数是用来创建对象的,因此对象不能调用构造函数。如果程序员没有提供任何构造函数,则C++将自动提供任何构造函数,但是它不做任何工作。但是只要程序员提供构造函数,则C++编译器就不会自动提供默认构造函数。所以,程序员必须自己提供默认构造函数,否则
ClassName classVar;这样代码会编译错误。定义默认构造函数的两种方式:
- 给已有构造函数的所有参数提供默认值。
- 通过函数重载定义一个没有参数的构造函数。
但是默认构造函数只能有一个,否则会产生二异性。所以上述两种方式只能采用一种。而且在隐式调用默认构造函数时,不要使用()。
Stock stock1(); //这是声明了一个名为stock1,无参数,返回值为Stock的函数
构造函数创建对象,等对象过期时,程序自动调用析构函数用来进行清理工作。最简单的是在构造函数中用new动态申请内存空间,在析构函数中用delete释放内存。
在默认情况下,将一个对象赋值给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。基本数据类型,结构变量,类对象原理一样。
C++的OOP特性的更多相关文章
- 高级OOP特性(6)
PHP不支持的高级OPP特性 PHP不支持通过函数重载实现多态 PHP不支持多重继承 PHP不支持根据所修改数据类型为操作符赋予新的含义 对象克隆 克隆实例 在对象前面添加clone关键字来克隆对象, ...
- 使用JavaScript OOP特性搭建Web应用
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
- LUA OOP编程实现方法
lua原生不支持OOP特性 确实如此, 同时可以采用其它lua代码的方式实现OOP的特性. OOP四大特性 抽象 封装 继承 多态 http://www.cnblogs.com/xiaosongluf ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- Php:学习笔记(一):版本选择
(注:本文来自网络) 超过75%的网站使用了PHP作为开发语言,wordpress,phpmyadmin和其他一些开源项目的盛行,带来了一大批的长尾用户.然而,他们一般安装之后却很少升级.下图是目前P ...
- 基于类型系统的面向对象编程语言Go
(整理自网络) 面向对象编程 Go语言的面向对象编程(OOP)非常简洁而优雅.说它简洁,在于它没有了OOP中很多概念,比如:继承.虚函数.构造函数和析构函数.隐藏的this指针等等.说它优雅,是它的面 ...
- C++ STL轻松导学
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
- C++——对象和类
最重要的OOP特性: *抽象: *封装和数据隐藏: *多态: *继承: *代码的可重用性: 一.抽象和类 1.类型 指定基本类型完成了三项工作:1).决定数据对象需要的内存数量:2).决定如何解释内存 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
随机推荐
- Python接口自动化--Json数据处理 5
1.Json模块简介,全名JavaScript Object Notation,轻量级的数据交换格式,常用于http请求中. Encoding basic Python object hierarch ...
- AlloyDesigner 使用
前端开发视觉是很重要的一部分,所以视觉的还原度很重要,今天给大家介绍一个很好用的视觉精度调整插件 一.下载AlloyDesigner插件 下载插件 二.保存视觉稿为图片格式 1.psd 用ps直接保存 ...
- 补码与C++的应用
12.inti=(int)((unsigned int)0xffffffff+(unsigned int)0xffffffff); printf(“%d”,i);结果是:C A.0 ...
- Fuel 30 分钟快速安装OpenStack
一直以来,对于openstack 的初学者来讲,安装往往是入门的头大难题.在E版本之前,要搭建一个基本能用的openstack 环境那是相当麻烦,自己要装机,自己搞源,自己照着文档敲命令,又没有靠谱的 ...
- CSS居中布局
一:水平居中方案: 1.行内元素 设置 text-align:center 2.定宽块状元素 设置 左右 margin 值为 auto 3.不定宽块状元素 a:在元素外加入 table 标签(完整的, ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-2-命令
Docker Commands Docker provider公开了一些额外的vagrant命令,这些命令对于与Docker容器交互非常有用.这有助于你在vagrant之上的工作流程,这样你就可以在底 ...
- vector,deque,list的区别和使用
vector: 表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低. deque: 也表示N段连续的内存区域组成,但与ve ...
- Android解决自定义View获取不到焦点的情况
引言: 我们在使用Android View或者SurfaceView进行图形绘制,可以绘制各种各样我们喜欢的图形,然后满怀信心的给我们的View加上onTouchEvent.onKeyDown.onK ...
- Android 一s个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...
- 关于MSCOCO_text数据集的探索
最近需要做图片中文本识别的项目,然后为了快速验证模型,所以找到了mscoco-text数据集,网站1上是这么说的: 官网是这么说的: 然而,我下下来之后: 1 - 先导入: 2 - 其中key为'im ...