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

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

时间:2025-01-02 19:26:47浏览次数:3  
标签:定义 -- 成员 类域 C++ month int year day

目录

类的定义

访问限定符

 类域

实例化

实例化的概念 


类的定义

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;
}

标签:定义,--,成员,类域,C++,month,int,year,day
From: https://blog.csdn.net/2303_79266237/article/details/144886815

相关文章

  • go框架读取外部json文件数据,gin框架读取外部json文件数据
    1、封装方法funcgetSetting()(map[string]interface{},error){ //获得当前项目路径 currentDir,err:=os.Getwd() iferr!=nil{ returnnil,err } //读取文件内容 file,err:=os.Open(currentDir+"/configs/setting.json") iferr!=nil{ ret......
  • 小白也能懂文本挖掘之词共线网络图
     词共线网络图,也被称为共词网络图或语义共现网络图,是一种基于文本数据中词汇共现关系构建的知识网络图。这种网络图以词汇(或称为“知识单元”)作为节点,以词汇之间的共现关系作为边,通过可视化的方式展示了词汇之间的关联性和结构特征。 主要涉及到文本预处理、词频统计、共......
  • shell脚本的使用
    一、思维导图 二、小练习1、在家目录下创建目录文件dir1,把/etc/passwd拷贝到dir1中,把/etc/group拷贝到dir1中并重命名为grp.txt,使用tree指令,显示dir1目录的文件树,把dir1,分别压缩为dir1.tar.xz,dir1.tar.gz,dir1.tar.bz2#!/bin/bashmkdirdir1cp/etc/group/home/ubuntu/d......
  • 单元化架构最佳实践指南!
    0前言单元化架构通过减少故障影响范围来增强系统的弹性。单元化架构是对于那些无法接受停机或可能对最终用户产生负面影响的系统的良好选择。单元化架构可能很复杂,有一些最佳实践可以遵循,以提高成功的机会。在推出单元化架构或将现有的云原生/微服务架构改造/转变为单元化架......
  • [数据结构学习笔记1] 为什么需要有数据结构
    程序本质上就是用来读取数据,然后操作数据,最后生成数据的。如果数据能被有效,或者有结构的展现,那将极大方便程序操作。举例:我们家里有很多工具,剪刀,锤子,斧头,扳手,放大镜,六角扳手,螺丝刀,尺子,卷尺,螺丝,便利贴等等。我们可以怎样收纳这些工具,使得我们后续可以方便的使用呢?第一种,我们家有......
  • 01java反序列化基础
    java反射的相关操作一些重要的方法获取类的⽅法:forName实例化类对象的⽅法:newInstance获取函数的⽅法:getMethod执⾏函数的⽅法:invoke//eg.反射获取任意类的任意方法并执行importjava.lang.reflect.Method;publicclassReflectionExample{publics......
  • 以太坊 solidity 笔记
    基础知识gasgas是衡量执行某些操作所需的计算量的单位,用来计算为了执行操作而需要支付给网络的费用数额。通俗理解,Gas是给矿工的佣金,并以ETH支付,无论是交易、执行智能合约并启动DApps,还是支付数据存储费用,都需要用到Gas。Gas的目的是限制执行交易所需的工作量,同时为执行......
  • 有哪些情况会导致索引失效
    1、索引列使用!=、not、isnull、isnotnull查询的时候,由于索引数据的检索效率非常低,因此Mysql引擎会判断不走索引。2、使用like通配符匹配后缀%xxx的时候,由于这种方式不符合索引的最左匹配原则,所以也不会走索引。但是反过来,如果通配符匹配的是前缀xxx%,符合最左匹配,也会走索引......
  • Day3算法练习——链表篇
    反转链表用头插法即可解决,双指针就能实现原地头插法,板子题需要熟练还是要理一下,简单题不能卡两两交换链表中的节点加上虚拟头节点会好很多指针多了,模拟起来比较麻烦,建议画图删除链表的倒数第N个结点slow指向要删的结点之前而不是要删的结点,会简单不少理清楚n个结点......
  • java8--类PrintWriter--文件内容写入--println&print&printf
    PrintWriterout=null;try{out=newPrintWriter("./src/test/myfile.txt","UTF-8");}catch(FileNotFoundExceptionfileNotFoundException){fileNotFoundException.printStackTrace();}catch(UnsupportedEncodingExceptio......