C++初阶 —— 类与对象(一)

本文详细介绍了C++中类的定义、访问控制、作用域、实例化,以及this指针的作用。从类的基本概念到实例操作,包括类的成员变量和函数,封装的实现,以及类对象的内存管理,为理解面向对象编程提供了深入指南。

目录

一,类定义

二,类的访问限定符及封装

三,类的作用域

四,类的实例化

五,类对象大小 

六,this指针


C语言关注的是过程,分析求解问题的步骤,通过函数调用逐步解决问题;

C++关注的是对象,将一件事拆分成不同对象,靠对象间交换完成;

C++的核心设计原则之一:"零开销抽象"(Zero-Overhead Abstraction),即高级抽象不应比手动编写的底层代码产生任何额外的运行时开销;

一,类定义

  • 在C中,结构体中只能定义变量;
  • 但C++中,结构体内不仅可以定义变量,还可定义函数;更喜欢用(class)来替代;
//struct内可定义变量和函数
struct S
{
	void fun(){cout << "class" << endl;}
	char _name[20];
	int _age[3];
};
int main()
{
	S s; //C++中将结构体看成特殊的类
	s.fun();
	return 0;
}

        类是 C++ 的核心特性,用于指定对象的形式(即描述对象),通常被称为用户定义的类型;定义一个类,本质上是定义一个数据类型的蓝图;

类定义:class(类关键字) + classname(类名字) + {}(类主体) +

  • 类中的元素称为类的成员;
    • 类中的数据—类属性/成员变量;
    • 类中的函数—类方法/成员函数

类定义的两种方式:

  • 声明和定义全部放在类体中,需注意,成员函数如在类中定义,编译器可能会将其当成内联函数处理;
  • 类声明放在.h文件,类定义放在.cpp文件中,一般采用此种方式;

注:

  • 成员函数的定义,即函数的实现;
  • 成员变量的定义,即开区间;
//类声明和定义全部放在类体中
//编译器可能会将成员函数当成内联函数处理
class Person
{
public: //访问修饰符:private/public/protected
    //方法或成员函数
	void showInfo(){cout << _name << "/" << _sex << "/" << _age << endl;}

public: //访问修饰符:private/public/protected
    //成员变量
	char* _name;
	char* _sex;
	int _age;
}; //封号结束
//.h 声明
class Person
{
public:
	void showInfo();
public:
	char* _name;
	char* _sex;
	int _age;
};

//.cpp 定义
void Person::showInfo()
{
	cout << _name << "/" << _sex << "/" << _age << endl;
}

二,类的访问限定符及封装

        C++实现封装的方式,用类将对象的属性与方法结合在一起,通过访问权限选择性的将其接口提供给外部的用户使用;访问限定符是限制类成员的访问,包括成员变量和成员函数;

访问类成员运算符

  • 点运算符(.),适用类对象;
  • 箭头运算符(->),适用于类对象指针;

访问限定符

  • public,在类内外均可直接访问;
  • private,仅在类内访问,类外无法访问,派生类也无法访问;
  • protected,类似private,但派生类可访问;
  • 访问权限作用域从该访问限定符出现位置开始直到下一个访问限定符出现为止;
  • class默认访问权限为private,struct则为public(需兼容C);

注:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别;

  • 编译器会根据访问限定符检查代码是否合法,如果尝试访问私有成员,编译器会报错,阻止编译通过;
  • 一旦代码通过编译并生成可执行文件,访问限定符的作用就结束了,在运行时,内存布局和访问权限不再受访问限定符的限制;

 C++中struct和class的区别:

  • C++需兼容C,所以C++中struct可当成结构体使用,此外struct还可用来定义类;
  • 和class定义类一样,struct默认访问权限为public,class为private;

封装 

面向对象三大特征:封装继承多态、抽象、反射(java)等;

  • 封装:将数据和方法进行有机结合,通过访问限定符来隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互;
  • 封装本质是管理;

三,类的作用域

  • 类定义了一个新的作用域,类的所有成员都在类的作用域中;
  • 在类外定义成员,需使用作用域限定符::),来指明成员属于的类域;
//声明
class Person
{
public:
	void showInfo();
public:
	char _name[20];
	char _sex[3];
	int _age;
};

//类外定义
void Person::showInfo()
{
	cout << _name << "/" << _sex << "/" << _age << endl;
}

作用域限定符::在运算符中等级最高,分三种:

  • 全局作用域符,::name
  • 命名空间作用域符,namespace::name
  • 类作用域符,class::name

注,{ }即可认为是一个域;

四,类的实例化

用类类型创建对象的过程,即称为类的实例化;

  • 类像个模型,限定了其成员,定义一个类并没有分配实际内存空间来存储;
  • 一个类可以实例化多个对象,实例化出的对象,占用实际的物理空间;
  • 类就像实际图纸,类实例化就是使用图纸建造出来;

实例化格式

  • [class] + 类名 + 对象名,自动调用默认无参构造函数,class可省略
    • ClassName obj
  • [class] + 类名 + 对象名(参数),显示调用有参构造函数,class可省略
    • ClassName obj(params)
//类的实例化
Person man;
Person woman;

匿名对象

  • 创建对象时没有指定对象名称的声明方式;
  • 匿名对象没有命名,只能创建后立即使用;

匿名对象的使用:

  • 用于简单的临时计算结果,可直接调用成员函数来访问成员变量;
  • 可作为函数实参、返回值、常量赋值、或作为其他表达式的操作数;
class A
{
public:
	//构造函数
	A(int a=1, int b=1)
		:_a(a), _b(b)
	{
		cout << "A(int a, int b)" << endl;
	}
	//拷贝构造函数
	A(const A& a)
	{
		_a = a._a;
		_b = a._b;
		cout << "A(const A& a)" << endl;
	}
	int get() const { return _a; } 
	void print(A a) { cout << a._a << endl; }
	const A& printf() { return A(); }
private:
	int _a;
	int _b;
};

int main()
{
	A().get(); //简单计算,简化代码
	A a = A(11, 12); //常量赋值,编译器优化省略拷贝构造,直接转化为A a(11,12)
	a.print(A()); //作为函数参数
	a.printf().get(); //作为返回值
	return 0;
}

注:内置类型变量初始化方式

//以下三种方式效果相同
int a=1; //直接赋值
int a(1); //括号初始化
int a{1}; //花括号初始化,C++11引入
 
int a(); //编译器会解析为函数声明

五,类对象大小 

类大小

  • 即该类中“成员变量”之和(非静态数据成员)
  • 需内存对齐;
  • 空类,比较特殊,编译器会给一个字节来唯一标识此类,此字节不存储有效数据;

类对象的存储方式

  • 对象包含所有类成员,对象成员变量是不同的,但却调用同一函数,如每一个对象函数都会存一份代码,浪费空间;
  • 只保存成员变量,成员函数(静态和非静态)存放在公共代码段;
  • 在多重继承和虚继承等情况下,对象存储方式可能会有所不同;此外还有一些特殊类型的对象有其特定的存储方式,如动态分配的对象和位域对象;

数据成员存储

  • 创建对象时,在对象内存中分配内存存储数据成员,可通过指针或引用访问;
  • 对象大小取决于其数据成员的数量和类型;
  • 如有虚函数,对象内存中还会存储一个指向虚函数表的指针;

函数成员存储

  • 成员函数不作为对象的一部分存储,是在程序代码段中定义(除内联函数可能在对象代码中展开);
  • 成员函数可访问对象数据成员和其他成员函数,但不可访问自身地址;

注:结构体内存对齐规则

  • 第一个成员偏移量为0;
  • 其他成员变量要对齐到对齐数的整数倍的地址处;
  • 结构体总大小,最大对齐数的整数倍;
  • 如嵌套结构体,嵌套结构体对齐到自己的最大对齐数的整数倍,结构体总大小为最大对齐数的整数倍(含嵌套结构体的对齐数);
  • 对齐数=编译器默认对齐数和该成员大小的较小值,vs默认为8;

六,this指针

  • 成员函数体中,没有关于不同对象的区分;不同对象调用成员函数时,C++通过引入this指针来解决;
  • C++编译器给每个“非静态的成员函数”增加一个隐藏的指针参数,让该指针指向当前对象;
  • 在函数体中,所有成员变量的操作,都是通过该指针去访问的;只是所有操作对用户是隐藏的,无需用户传递,编译器自动完成;

this指针的特性

  • this指针的类型,类类型* const ;
  • this指针只能在“成员函数”的内部使用;
  • this指针本质上其实是一个成员函数的形参,对象调用成员函数时,将对象地址作为实参传递给this形参,this指针存于栈帧中;
  • this指针是成员函数第一个隐含的指针形参,vs编译器一般通过ecx寄存器自动传递,无需用户传递;
//定义一个类
class Date
{
public:
	void Display()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
	void SetDate(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
        Display();
	}
private:
	int _year;
	int _month;
	int _day;
};

//实际成员函数
void Display(Date* this)
{
	cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
}
void SetDate(Date* this, int year, int month, int day)
{
	this->_year = year;
	this->_month = month;
	this->_day = day;
    this->Display();
}
//此程序可正常运行
//因为成员函数地址存于公共代码段
//调用函数时不会去访问p指向的空间,不存在空指针的解引用
//只会把p传递给隐形的this指针,且show函数内也没有解引用this指针
class A
{
public:
    void show()
    {
        cout << _a << endl;
    }
private:
    int _a;
};
int main()
{
    A* p = nullptr;
    p->show();
    return 0;
}

内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文系统阐述了CUDA并行计算的核心优化技巧,围绕提升SM利用率、最大化内存带宽、隐藏访存延迟和减少指令开销四大目标,从GPU硬件架构、线程模型、内存访问、指令执行、内核设计及工程实践六个维度展开。重点讲解了线程块配置、Warp分支发散规避、全局内存合并访问、共享内存Bank冲突避免、寄存器与常量内存使用、异步传输与多流并行、快速数学函数、原子操作优化、内核拆分与融合、Tensor Core利用等关键技术,并提供了编译优化参数和Nsight系列性能分析工具的使用指导,形成了一套完整的CUDA性能优化方法论。; 适合人群:具备CUDA编程基础,从事高性能计算、深度学习、科学计算或GPU加速开发的工程师与研究人员,尤其适合工作2年以上的开发者提升底层优化能力。; 使用场景及目标:①解决CUDA程序中SM利用率低、内存带宽不足、访存延迟高等性能瓶颈;②掌握从基础到高阶的系统性优化策略,实现程序性能的指数级提升;③结合Nsight工具进行性能剖析与迭代优化。; 阅读建议:学习时应结合实际代码调试与性能分析工具(如Nsight Compute和Nsight Systems)进行验证,优先实施线程块配置、合并访问、-O3编译等低成本高回报的基础优化,再逐步深入共享内存优化、内核融合、Tensor Core利用等高阶技术,同时推荐优先使用cuBLAS、cuDNN等NVIDIA官方优化库以逼近硬件极限性能。
内容概要:本文提供了一份完整的“大学生创新创业训练计划项目”申报材料模板包,围绕“基于深度学习的智能垃圾分类回收箱设计与实现”项目,详细展示了从项目申报书、答辩PPT、中期检查表到结题报告的全套规范文档。内容涵盖项目背景、目标、研究内容、技术路线、创新点、进度安排、预期成果、经费预算及风险应对等关键环节,并以实际案例呈现各阶段成果,如YOLOv8轻量级模型识别准确率达96%、单台成本控制在780元、校园试点回收520kg可回收物、获得软著与论文成果等,形成可复制推广的校园绿色解决方案。; 适合人群:参与大学生创新创业训练计划(大创项目)的本科生团队,尤其是工科类、计算机相关专业、有意向开展人工智能+环保类实践项目的1-3年级学生;同时也适用于指导教师和项目评审人员作为参考模板。; 使用场景及目标:①帮助学生团队系统规划并撰写高质量的大创项目申报书与结题报告;②指导项目全过程管理,包括技术实施、进度控制、经费使用与成果凝练;③支撑项目答辩展示,提升项目规范性与竞争力,冲击“互联网+”“挑战杯”等赛事奖项; 阅读建议:此资源不仅提供文本模板,更体现了项目从立项到结题的完整逻辑链条,使用者应结合自身课题,参照其结构化表达方式、量化目标设定和技术落地路径进行模仿与创新,注重理论与实践结合,强化数据支撑与成果可视化。
内容概要:本文提供了一个基于Simulink的光伏储能单相逆变器并网仿真模型,系统实现了并网逆变电路的PWM调制控制、闭环控制策略及并网运行特性的仿真分析,涵盖系统建模、控制算法设计、稳定性验证与动态性能评估等关键环节。该模型不仅支持对单相逆变器在并网过程中的电流谐波、功率因数、电能质量及系统稳定性的深入研究,还可拓展应用于多类型电力系统仿真场景,如MPPT控制、软开关技术、微电网能量管理、短路故障分析(包括单相、两相接地及相间短路)、直流电机双闭环控制、Buck/Boost类变换器控制等,展现出广泛的科研适配性与工程实践价值。; 适合人群:面向具备电力电子、自动控制理论或电气工程背景,熟练掌握Simulink/Matlab仿真工具,从事新能源发电系统、微电网控制、逆变器拓扑与控制策略研究的硕士/博士研究生、科研人员及电力系统相关领域的工程技术人员。; 使用场景及目标:①开展光伏发电系统并网控制策略的设计与仿真验证;②学习并掌握单相逆变器PWM调制、锁相环(PLL)、电压电流双闭环控制等核心技术的建模方法;③作为课程设计、毕业设计或科研项目的仿真平台,支撑控制系统开发与优化;④结合文中提供的多种电力系统案例(如故障仿真、储能控制、微网调度),进行横向对比与综合能力提升; 阅读建议:建议读者结合文中列出的多个仿真案例进行扩展学习,重点关注控制器参数设计与系统动态响应之间的关系,动手复现模型并进行仿真调试,通过改变负载、电网条件或控制参数,深入理解并网逆变器的工作机理与控制规律,从而提升实际科研与工程应用能力。
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
因为工作需要,每天需要打很多次卡,然后忙起来就忘了,忙完了就会想,刚才打卡了吗?弄错就会漏打卡了,漏打卡会有处罚。就想到写一个程序来解决这个痛点。就有了本次发布的这个程序。 PHP项目,修改起来也简单,也方便二开。本来就是H5页面布局,部署好,直接手机浏览器打开,或者使用封装工具,封装成apk。本人已打包为微信小程序,使用起来很方便。 项目简介 本项目是一个多用户打卡记录系统,基于 PHP + MySQL 开发,提供简洁的用户打卡功能和记录管理。 核心功能 功能模块 描述 用户认证 支持用户注册、登录、密码修改、密码重置 打卡功能 用户可进行每日打卡,记录打卡时间 记录查询 支持按日期查询打卡记录 用户管理 支持头像上传、个人信息查看 数据统计 提供打卡统计功能 技术特点 轻量级架构:纯 PHP 开发,无需框架依赖,部署简单 响应式设计:移动端友好的 UI 界面,支持触摸操作 安全性: 使用 prepare + bind_param 防止 SQL 注入 密码采用哈希加密存储 Session 会话管理用户状态 模块化设计:API 接口与前端分离,便于扩展 项目结构 Plain Text ├── api/ # RESTful API 接口 │ ├── checkin.php # 打卡接口 │ ├── login.php # 登录接口 │ ├── register.php # 注册接口 │ ├── records.php # 记录查询接口 │ ├── stats.php # 统计接口 │ └── … ├── config/ # 配置文件 │ ├── database.php # 数据库配置 │ └── auth.php # 认证配置 ├── sql/ # 数据库脚本 │ └── init.sql # 初始化脚本 ├── avatars/ # 头像存储目录 ├── ind
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值