C++语言-03-类与对象
类
类是面向对象编程中的核心概念,用于定义一个数据类型的蓝图,描述类的对象包括什么,以及可以在这些对象上执行那些操作。
类的成员
- 数据成员
描述数据的表示方法
class ClassName {
accessType:
MemberVariableType memberVariable;
};
- 函数成员
定义和原型写在类定义内部的函数,可以操作类的任意对象,可以访问对象中的任意成员,定义方式如下
class ClassName {
accessType:
// 函数成员
ReturnType functionName() {
// Body of the function
}
} ClassInstance;
/**
其中 ClassInstance 是类的实例,为可选项
*/
成员函数定义的方式
在类的内部定义
class Animal {
public:
void run() {
cout << "Animal is running." << endl;
}
};
使用范围解析运算符 :: 在类的外部定义
class Animal {
// 数据成员
public:
int age;
// 函数成员
public:
void run();
};
void Animal::run() {
cout << "Animal is running" << endl;
}
- 数据成员
访问修饰符
- 数据隐藏是OOP中重要的概念,C++使用访问修饰符实现数据隐藏的目的
- 访问修饰符的种类
- public
- 在程序中类的外部可以访问
- protected
- 在该类中与私有成员的访问权限一样,但是在派生类中可以访问
- private
- 在程序中类的外部不可访问
- 只有类和友元函数可以访问私有成员
- public
this指针
- 每一个类对象都有一个this指针指向自己的内存地址
- 注意
- this指针是所有成员函数的隐含参数,用来指向调用对象
- 非成员函数没有this指针,如:友元函数,静态成员函数
- 示例
成员函数
// 向类Animal中,添加成员函数 int compare(Animal animal) 比较两个动物,哪个更年长
int compare(Animal animal) {
return this->age > animal.age;
}
友元函数
// 向类Animal中添加友元函数 int compare(Animal animal)
friend int compare(Animal animal);
// 实现友元函数,在友元函数中使用this指针,会产生编译错误
int compare(Animal animal) {
// error: Invalid use of 'this' outside of a non-static member function
return this->age > animal.age;
}
指向类的指针
指向类的指针与指向结构的指针类似,访问成员需要使用成员访问运算符 ->,且与其他任何指针一样,在使用之前必须先初始化
示例
int main(int argc, const char * argv[]) {
// 类对象
Animal dog;
dog.age = 5;
dog.run();
// 指向类的指针
Animal *animalPointer;
animalPointer = &dog;
// 通过指向类的指针访问类的成员
cout << "Dog 的年龄为:" << animalPointer->age << endl;
return 0;
}
静态成员
静态成员在类对象中只有一个副本,即被类的所有对象共享
类型
- 静态数据成员
静态数据成员不能在类定义中初始化,在类定义外需要使用范围解析运算符 :: 重新声明从而对其初始化,若没有指定类的静态成员的初始化语句,静态数据成员会被初始化为零
示例
// 向类Animal添加静态数据成员animalCount,用于计算创建的动物的总数
private:
static int animalCount;
// 若在类定义中初始化静态数据成员,将会报如下的编译错误
// Error: Non-const static data member must be initialized out of line
// static int animalCount = 0;
// 在类定义外初始化Animal类中的静态数据成员animalCount
int Animal::animalCount = 0;
- 静态函数成员
静态函数成员在类对象不存在的情况下,使用类名加范围解析运算符 :: 调用,使成员函数与具体的对象分离开
静态成员函数的访问限制
- 只能访问静态数据成员
- 不能访问其他静态成员函数和类外部的其他函数
- 具有类范围,不能范文this指针(与实际的类对象无关)
示例
// 向类Animal中添加静态成员函数,获取当前类的对象总数
static int getAnimalCount() {
return animalCount;
}
- 静态数据成员
main()函数
int main(int argc, const char * argv[]) {
cout << Animal::getAnimalCount() << endl;
Animal dog;
cout << Animal::getAnimalCount() << endl;
return 0;
}
友元
- 友元函数(有关函数的详细内容请参阅下方Blog)
- 友元类
多一个类是另一个类的友元,则该类及其所有成员都是友元
定义
// 类Animal
class Animal {
// 定义AnimalAction为Animal的友元类
friend class AnimalAction;
};
// 友元类AnimalAction
class AnimalAction {
// body of the class
};
对象
- 对象是类的具体实例,指向内存中的一块地址,保存有与该对象相关的信息
C++语言-03-类与对象的更多相关文章
- [Objective-C语言教程]类和对象(24)
Objective-C编程语言的主要目的是为C编程语言添加面向对象,类是Objective-C的核心特性,支持面向对象编程,通常称为用户定义类型. 类用于指定对象的形式,它将数据表示和方法组合在一起, ...
- Java面向对象03——类与对象的创建
类的创建与初始化对象 age: 以类的方式组织代码,以对象的组织(封装)数据 package oop.demon01.demon02; // 学生类(抽象模板) public class Stu ...
- OC语言-01类和对象
// cc 文件名.m -framework Foundation 编译链接 #import <Foundation/Foundation.h> //枚举性别 typedef enum{ ...
- C/C++编程笔记:C++入门知识丨类和对象
本篇要学习的内容和知识结构概览 类及其实例化 类的定义 将一组对象的共同特征抽象出来, 从而形成类的概念. 类包括数据成员和成员函数, 不能在类的声明中对数据成员进行初始化 声明类 形式为: clas ...
- flutter--Dart基础语法(三)类和对象、泛型、库
一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源.免费,拥有宽松的开源协议,支持移动.Web.桌面和嵌入式平台. ...
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...
- iOS学习之Object-C语言类和对象
一.OC语言的特点:封装,继承,多态:包含一个运行时系统:类库丰富. 二.面向对象 1.概述 OOP(Object Oriented Programming)面向对象编程. ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- OC语言的面向对象—类和对象、方法
1. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 ➢ 打开电脑 ➢ ...
- Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象
15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ...
随机推荐
- Nopcommerce主要的技术
Nopcommerce主要用到的技术及特点: 1.Entity Framework 2.ASP.NET mvc 3.IoC容器+依赖注入(Autofac) 4.使用EF中的EntityTypeConf ...
- AVL树(二)之 C++的实现
概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍2. AVL树的C++实现3. AVL树的C++测试程序 转载请注明出处:ht ...
- [OpenCV] Image Processing - Grayscale Transform
"每个像素的输出值只取决于其输入值" 重难点:Histogram equalization 参考:笑得很甜 http://blog.csdn.net/xiaowei_cqu/art ...
- Tomcat Clustering - A Step By Step Guide --转载
Tomcat Clustering - A Step By Step Guide Apache Tomcat is a great performer on its own, but if you'r ...
- js-计时事件
JavaScript 一个设定的时间间隔之后来执行代码,称之为计时事件. 主要通过两个方法来实现: 1.setInterval() - 间隔指定的毫秒数不停地执行指定的代码. 2.se ...
- 投票系统 & 简易js刷票脚本
早就听说有什么刷票脚本,微博投票等等相关的投票都有某些人去刷票. 试一下吧,兴许自己也会刷票呢?捣鼓了几个小时,终于有所眉目. (1)投票系统 要刷票,就得先有个投票界面. 当然,可以直接去各个投票网 ...
- WPF学习之深入浅出话命令
WPF为我们准备了完善的命令系统,你可能会问:"有了路由事件为什么还需要命令系统呢?".事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于如何响应事件 ...
- 一些JavaScript题目
在JavaScript中,运行下面代码,sum的值是(). var sum=0;for(i=1;i<10;i++){if(i%5==0)break;sum=sum+i;} A. 40B. 50C ...
- 微软modern.IE网站,多版本IE免费测试工具集
微软今天发布了modern.IE,这是一系列免费的.针对Web 开发者的测试工具和资源集合网站,微软希望以此来帮助开发者更轻松地实现跨 IE 和其他现代浏览器.跨设备的兼容性,其他还有代码检测工具.标 ...
- HTML5标准简介
最近前端的群都蛮热闹的,但我发现多数讨论的是javascript和css相关的问题,仿佛大家在努力创建各种交互.样式的时候,忘却了这一切的基础 – HTML. 其实我很喜欢HTML,觉得这个语言远比X ...