当前位置: 首页 > article >正文

<<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>

目录

类的定义

访问限定符

 类域

实例化

实例化的概念 


类的定义

class为定义类的关键字,Date为类的名字(类名就相当于类型),{ }中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数

为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。

class Date
{
    //成员函数
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

    //成员变量
    // 为了区分成员变量,⼀般习惯上成员变量
    // 会加⼀个特殊标识,如_ 或者 m开头

	int _year;
	int _month;
	int _day;
};

C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类

//ListNodecpp就代表类形
struct ListNodecpp
{
	void Init(int x)
	{
		next = nullptr;
		val = x;
	}

	ListNodecpp* next;
	int val;
};

 定义在类⾯的成员函数默认为inline。


访问限定符

 C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的⽤户使⽤。

 public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};


问题与解答:

问题:C++中struct也变成了类,那么和class有什么区别?

解答class定义成员没有被访问限定符修饰时默认为private,struct默认为public

问题:C++为什么要设置私有、公有?

解答:首先,C语言对程序员的素质要求极高,这是因为C语言比较自由,既可以通过函数访问,也可以直接去访问。自由也意味着混乱。

//注意初始化
void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

//通过函数取顶部元素
STDataType STTop(ST* ps)
{
    assert(ps);
    return ps->a[ps->top - 1];
}

//直接取顶部元素,但要注意初始化,容易出错
ST st1;
STInit(&st1);
int top = st1.a[st1.top]; //[st1.top - 1] 才是正确的顶部元素

 类域

类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作 ⽤域操作符指明成员属于哪个类域

类域影响的是编译的查找规则,当声明和定义分开写时,要加上类域,这样就会在类域里查找。如果不加上类域,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。 

//Stack.h
class Stack
{
public:
	//缺省参数写在函数声明里
	void Init(int n = 4);

private:
	int* arry;
	size_t top;
	size_t capacity;
};

//Stack.cpp
//声明和定义分离需要指定类域
void Stack::Init(int n)
{
	arry = (int*)malloc(n * sizeof(int));
	if (arry == nullptr)
	{
		perror("malloc fail");
		return;
	}
	top = 0;
	capacity = n;
}

实例化

实例化的概念 

 定义出来的类相当于图纸,用类创建对象的过程,成为实例化对象

类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间

⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。打个⽐ ⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多 少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房 ⼦才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。 

 

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:

	//这里只是声明,没有开空间
	int _year;
	int _month;
	int _day;
};

int main()
{
	//实例化对象才分配内存
	Date d1;
	return 0;
}


http://www.kler.cn/a/464088.html

相关文章:

  • 腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎
  • sklearn_pandas.DataFrameMapper的用法
  • 数据结构与算法之动态规划: LeetCode 213. 打家劫舍 II (Ts版)
  • scrapy 教程
  • Oracle exp和imp命令导出导入dmp文件
  • JVM实战—9.线上FGC的几种案例
  • 第11章 汇编语言--- 内存模型概述
  • 文件本地和OSS上传
  • 虚拟机中的时统卡功能和性能调优
  • AI 驱动研发模式升级,蓝凌软件探索效率提升之道
  • 699: Arbitrage
  • 小组作业协同介绍
  • 代码随想录算法训练营第51期第32天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 基于Python的携程旅游景点数据分析与可视化
  • 【C++指针】知识点思维导图
  • 大语言模型提示技巧(二)-给模型时间思考
  • Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
  • 【开源免费】基于SpringBoot+Vue.JS音乐网站(JAVA毕业设计)
  • pdf预览 报:Failed to load module script
  • 信息搜集250102
  • 家政服务管理系统|Java|SSM|VUE| 前后端分离
  • 分布式 L2 网关下的 OVS 未知单播泛洪
  • 【设计模式】 基本原则、设计模式分类
  • 【安卓开发】【Android Studio】项目构建失败提示【Could not read metadata.bin】解决方法
  • 2025年,测试技能支棱起来。
  • 每天40分玩转Django:Django安全专题