C++语言基础(3)-类和对象
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。
一.类的定义
一个简单的类的定义:
- class Student{
- public:
- //成员变量
- char *name;
- int age;
- float score;
- //成员函数
- void say(){
- cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
- }
- };
class
是 C++ 中新增的关键字,专门用来定义类。Student
是类的名称;类名的首字母一般大写,以和其他的标识符区分开。{ }
内部是类所包含的成员变量和成员函数,它们统称为类的成员(Member);由{ }
包围起来的部分有时也称为类体,和函数体的概念类似。
注意:在类定义的最后有一个分号;
,它是类定义的一部分,表示类定义结束了,不能省略。
类只是一个模板(Template),编译后不占用内存空间,所以在定义类时不能对成员变量进行初始化,因为没有地方存储数据。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。
二.创建对象并访问类的成员
创建对象的方式如下:
- #include <iostream>
- using namespace std;
- //类通常定义在函数外面
- class Student{
- public:
- //类包含的变量
- char *name;
- int age;
- float score;
- //类包含的函数
- void say(){
- cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
- }
- };
- int main(){
- //创建对象
- Student stu;
- stu.name = "小明";
- stu.age = ;
- stu.score = 92.5f;
- stu.say();
- return ;
- }
运行结果:
小明的年龄是15,成绩是92.5
stu 是一个对象,占用内存空间,因此可以对它的成员变量赋值,也可以读取它的成员变量。类通常定义在函数外面,当然也可以定义在函数内部,不过很少这样使用。
三.使用对象指针
C语言中经典的指针在 C++ 中仍然广泛使用,尤其是指向对象的指针,没有它就不能实现某些功能。
上面代码中创建的对象 stu 在栈上分配内存,需要使用&
获取它的地址,例如:
- Student stu;
- Student *pStu = &stu;
pStu 是一个指针,它指向 Student 类型的数据,也就是通过 Student 创建出来的对象。
同样,也可以在堆区创建对象,此时就要用到new关键字:
- Student *pStu = new Student;
如:
- #include <iostream>
- using namespace std;
- class Student {
- public:
- char *name;
- int age;
- float score;
- void say() {
- cout << name << ",age is " << age << ",score is " << score << endl;
- }
- };
- int main()
- {
- // Student stu;
- // stu.name = "JACK";
- // stu.age = 15;
- // stu.score = 92.5f;
- // stu.say();
- // Student stu; // 在栈区创建对象
- // Student *pStu = &stu;
- Student *pStu = new Student; // 在堆区创建对象
- pStu ->name = "Jack";
- pStu -> age = ;
- pStu -> score = 92.5f;
- pStu -> say();
- delete pStu; // 删除对象
- return ;
- }
注意:在栈上创建出来的对象都有一个名字,比如 stu,因此使用指针指向它不是必须的。但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。
也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。
栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。在实际开发中,new 和 delete 往往成对出现,以保证及时删除不再使用的对象,防止无用内存堆积。
C++语言基础(3)-类和对象的更多相关文章
- Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象
15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ...
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- C++_基础_类和对象
内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...
- J2SE基础:1.类和对象基础
什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...
- OC语言的面向对象—类和对象、方法
1. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 ➢ 打开电脑 ➢ ...
- Java基础教程——类和对象
视屏讲解:https://www.bilibili.com/video/av48272174 面向过程 VS 面向对象 面向过程:强调步骤. 面向对象:强调对象. 面向对象的特点就是:隐藏具体实现的细 ...
- ObjectiveC1基础代码——类和对象
// // main.m // ObjectiveC1 // // Created by scjy on 15/10/30. // Copyright © 2015年 lizhipeng. A ...
- java基础知识—类和对象
1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...
- Java基础-3类和对象声明与创建
一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...
随机推荐
- [BZOJ2823][BZOJ1336][BZOJ1337]最小圆覆盖(随机增量法)
算法介绍网上有很多,不解释了. 给出三点坐标求圆心方法:https://blog.csdn.net/liyuanbhu/article/details/52891868 记得先random_shuff ...
- 【kd-tree】bzoj3290 Theresa与数据结构
离线所有操作,对所有可能存在的点建立kd-tree,add相当于权值+1,cancel相当于权值-1. 修改操作要记录kd-tree上每个点的fa,从底向上地进行修改. 优化:若一个矩形框的sumv= ...
- 5.8 Properties
一.Propertie 主要用于读写资源配置文件. Properties继承自Hashtable. 我们来看下HashMap和Hashtable的区别: Hashtabl 线程安全, 同步, ...
- BUG YII2.0 cURL error 6: Could not resolve host:
BUG描述:登录直接显示 原因:服务器设置端口权限,或者DNS毛病 解决方案:只能去服务器端设置,配置端口 DNS: 修改dns 114.114.114.114 或者 8.8.8.8
- java-继承-类变量与实例变量
父类中的类的变量(静态属性)与其子类共享一份. 父类中的实例变量与其子类各自维护各自的.
- Android 多线程之HandlerThread 完全详解
关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...
- Win7用IIS发布网站系统 部署项目
1.首先确保系统上已经安装IIS [控制面板]→[程序]→[程序和功能]→[打开或关闭Windows功能] 选中Internet 信息服务下面的所有选项,点击确定. 2. 获得发布好的程序文件 若没有 ...
- ylbtech-LanguageSamples-CommandLine(命令行参数)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-CommandLine(命令行参数) 1.A,示例(Sample) 返回顶部 “命令行参 ...
- 自己做的roguelike+恶魔城游戏《魔塔猎人》已发布。
游戏仍然是标准的roguelike,死亡后回到出生点重新开始,宏观架构上参考了<死亡细胞>,战斗设计上更加强调轻重攻击的组合,再配合236和28系列的搓招技.空中的突进飞腿.副武器等等. ...
- 微信团队分享:iOS版微信是如何防止特殊字符导致的炸群、APP崩溃的?
本文来自微信开发团队yanyang的技术分享. 1.引言 相信大家都遇到过一段特殊文本可以让iOS设备所有app闪退的经历.前段时间大年初一,又出现某个印度语字符引起iOS11系统奔溃,所幸iOS版微 ...