c++面向对象之类

news2025/1/14 1:12:25

一、类的定义

class 类名{
     成员属性
     构造函数
     析构函数
     成员函数
}

Person.h

#include <string>
#include <iostream>
using namespace std;


class Person {
	int m_age;
	string m_name;

	Person();

	Person(int age,string name);

	~Person();

	int getAge();

	void setAge(int age);

	string getName();

	void setName(string name);
};


Person.cpp

#include "Person.h"

Person::Person() {}

Person::Person(int age, string name) :m_age(age), m_name(name) {}

Person::~Person() {
    cout <<"析构函数调用" << endl;
}

int Person::getAge() {
	return m_age;
}

void Person::setAge(int age) {
	m_age = age;
}

string Person::getName() {
	return m_name;
}

void Person::setName(string name) {
	m_name = name;
}
  • 如果要使用string类型的话,第一、需要添加#include <string>;第二、需要添加std的命名空间(using namespace std;)或者使用std::string
  • 类里面的所有成员属性和函数默认都是私有的(private)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    只需要调整访问权限为public即可。
    在这里插入图片描述
    在这里插入图片描述

二、类的实例对象创建

2.1、声明的时候,在栈中创建对象

Person person;

在这里插入图片描述

  • 在栈中创建的对象会随着main函数执行的结束而销毁

2.2、使用new,在堆中创建对象

Person *person = new Person();

在这里插入图片描述

  • 使用new创建的是一个指针
  • main函数执行结束,person对象并没有调用析构函数,说明该对象还没有销毁,需要手动调用delete
    在这里插入图片描述

2.3、使用malloc,在堆中创建对象

Person *person = (Person*)malloc(sizeof(Person));

在这里插入图片描述

  • malloc创建的也是一个指针
  • malloc创建对象的时候,没有调用构造方法,只是在堆中开辟了所需要大小的内存空间
  • 需要调用free方法,来销毁创建的对象,释放内存
    在这里插入图片描述
  • 无论是使用malloc创建对象,以及使用free销毁对象,都不会调用类的构造函数析构函数

三、类的成员属性的初始化

3.1、无构造函数的类

Person.h

#include <string>
#include <iostream>
using namespace std;


class Person {
	int m_age;
	string m_name;
public:
	~Person();

	int getAge();

	void setAge(int age);

	string getName();

	void setName(string name);
};

Person.cpp

#include "Person.h"

Person::~Person() {
    cout <<"析构函数调用" << endl;
}

int Person::getAge() {
	return m_age;
}

void Person::setAge(int age) {
	m_age = age;
}

string Person::getName() {
	return m_name;
}

void Person::setName(string name) {
	m_name = name;
}

在这里插入图片描述

  • 对于无构造方法的类,只有只用new创建的对象的成员属性才会被初始化。

3.2、有构造函数的类

Person.h

#include <string>
#include <iostream>
using namespace std;


class Person {
	int m_age;
	string m_name;
public:
	Person();

	Person(int age,string name);

	~Person();

	int getAge();

	void setAge(int age);

	string getName();

	void setName(string name);
};


Person.cpp

#include "Person.h"

Person::Person() {
	cout << "构造方法调用" << endl;
}

Person::Person(int age, string name) :m_age(age), m_name(name) {}

Person::~Person() {
    cout <<"析构函数调用" << endl;
}

int Person::getAge() {
	return m_age;
}

void Person::setAge(int age) {
	m_age = age;
}

string Person::getName() {
	return m_name;
}

void Person::setName(string name) {
	m_name = name;
}

在这里插入图片描述

  • 如果类有构造函数,但是构造函数里面并没有对成员属性进行初始化的话,无论何种方式创建对象,对象的成员属性都不会被初始化

四、类的构造函数

4.1、定义

构造函数,是一种特殊的方法(没有返回值,方法名和类名相同)。 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值。

4.2、实现

Test.h

#pragma once
class Test
{
public:
	int number_;

	Test();
	Test(int number);
};

Test.cpp

#include "Test.h"

Test::Test() {}

Test::Test(int number) {
    number_ = number;
}

  • 构造函数没有返回值
  • 构造函数的函数名称与类名相同
  • 构造函数可以重载

4.3、初始化列表

4.3.1、格式

标准构造函数格式:

Test::Test(int number) {
    number_ = number;
}

初始化列表格式:

Test::Test(int number) :number_(number) {}

4.3.2、优势

  • 传入参数可以是表达式
int a = 10;
Test* test = new Test(a+10);

在这里插入图片描述

  • 传入参数可以是函数
#include <iostream>
#include "Test.h"
using namespace std;

int add(int a,int b);
int main() {
	int a = 10;
	Test* test = new Test(a+add(a,2));
	cout << test->number_ << endl;
	return 0;

}

int add(int a, int b) {
	return a * b;
}

在这里插入图片描述

  • 搭配默认参数,创建对象时,构造函数更灵活
    PS:如果是采用声明和实现分离的方式定义类的话,初始化列表是写在头文件中的
    Test.h
#pragma once

class Test
{
public:
	int number_;

	Test(int number=0) :number_(number) {};
};
#include <iostream>
#include "Test.h"
using namespace std;

int main() {
	Test *test=new Test();
	cout << test->number_ << endl;

	Test *test1=new Test(18);
	cout << test1->number_ << endl;
	return 0;

}

在这里插入图片描述

4.4、补充

4.4.1、如果不创建构造函数,创建对象的时候会创建默认的构造函数吗?

Test.h

#pragma once
class Test
{
public:
	int number_=0;
};

在这里插入图片描述

  • 如果成员属性默认赋值,则会生成默认的构造函数,还会调用默认的构造函数
#pragma once
class Test
{
public:
	int number_;
};

在这里插入图片描述

  • 如果成员属性没有赋值,则不会生成默认的构造函数。

4.4.2、创建对象的时候,new test和new Test()有什么区别

  • 如果类没有显示声明构造函数,都不会调用创建构造函数,但是带括号的会初始化成员属性
    在这里插入图片描述

在这里插入图片描述

  • 如果自定义构造函数,则都会调用构造方法,并且都不会初始化成员属性
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝鲸平台通过标准运维 API 安装 Agent

目录 一、背景 二、目的 三、创建安装agent流程 四、通过标准运维 API 安装 Agent 五、总结 一、背景 蓝鲸平台正常情况纳管主机需要在节点管理手工安装agent&#xff0c;不能达到完成自动化安装agent的效果。想通过脚本一键安装agent&#xff0c;而不需要在蓝鲸平台进行过…

Golang指针的操作以及常用的指针函数

目录 指针的操作 定义指针 获取变量地址 解引用指针 指针作为函数参数 指针的空值 常用的指针函数 new 函数 make 函数 append 函数 copy 函数 指针的操作 在Go语言中&#xff0c;指针是一种非常重要的类型&#xff0c;可以用来传递变量的地址而不是变量本身。 定…

【leetcode刷题总结】——代码随想录(链表总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构&#xff0c;再从简单刷起&#xff0c;做了几个类型题目之后&#xff0c;再慢慢做中等题目、困难题目。 以下是个人刷题总结&#xff0c;官…

多个Node.js版本之间切换

本篇文章会讲windows和Mac系统下实现多个node.js版本之间的切换。 1.windows下采用nvm&#xff08;nvm-window&#xff09; 2.Mac下采用nvm和n 注&#xff1a;window和mac下的nvm地址是不一样的 一、windows系统 什么是nvm&#xff1f; nvm是一个简单的bash脚本&#xff…

真题详解(有限自动机)-软件设计(七十七)

确定有限自动机 和 不确定有限自动机 解析&#xff1a; M1的A当0的时候&#xff0c;会变成A&#xff0c;也可能变成B&#xff0c; 所以M1是不确定有限自动机。 M2的A1的时候只会使A&#xff0c;0的时候只会是B B的0只会是B&#xff0c;1的时候只会是C。 C0的时候只会是B&a…

中小型企业需要“数据防泄露”吗?

数据防泄露是指企业采取的各种管理、技术与监督措施&#xff0c;以防止敏感和关键数据在传输、存储与使用过程中被未经授权访问或窃取&#xff0c;从而导致机密性、完整性或可用性受到损害。 数据防泄露工作通常包括数据分类与风险评估、权限管理与访问控制、加密与安全技术、数…

基于Gabor-小波滤波深度图表面法线的特征提取算法【通过正常Gabor-小波的直方图进行2D或3D特征提取】研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Bean的生命周期揭秘:从诞生到消亡,一个对象的壮丽演绎!

大家好&#xff0c;我是你们的小米。今天我要给大家揭秘一下Java开发中重要的概念——Spring Bean的生命周期。作为Java开发者&#xff0c;无论是在面试还是实际工作中&#xff0c;了解Bean的生命周期都是必备的知识点。让我们一起来深入了解吧&#xff01; 什么是Spring Bean …

【zabbix】PostgreSQL表信息查询收集监控

昨天开发那边给了一个需求&#xff0c;每隔一段时间查询一下数据库某表中的数据是否在最近更新&#xff0c;让我这边做一个监控信息收集 一、agent linux侧配置 这边目前就直接在zabbix上实现&#xff0c;首先就是脚本&#xff0c;我用python2实现 脚本名&#xff1a;check_y…

软件测试学什么——如何才能按时上线?

目录 引言 一、提前介入测试&#xff0c;认真做好需求分析。 二、测试计划没必要花太多精力。 三、测试用例编写 四、测试执行的关键点 五、测试环境 【一套系统提升学习的好资料】 阅读书籍文档 总结 引言 上线&#xff0c;永远是软件测试工程师最关注的问题。 上线…

Linux文件系统学习笔记

笔记 修改文件属性与权限数字修改文件权限符号修改文件权限 目录与文件的意义文件的权限目录的权限 路径 修改文件属性与权限 chgrp:修改用户组 chown:修改拥有者 chmod:修改用户权限 其中修改权限:chmod可以用数字修改或者符号修改 数字修改文件权限 一共有三种身份:拥有者…

freeswitch的2833和inband对接方案

概述 freeswitch支持三种模式的DTMF传输方式&#xff0c;分别时inband、INFO、2833。 在传统的PSTN网络中&#xff0c;所有的DTMF码都是inband模式&#xff0c;所以VOIP网络和PSTN网络对接中&#xff0c;需要将DTMF码做格式转换&#xff0c;通常是2833和inband之间的转换。 …

《思考致富》制造借口是一个根深蒂固的习惯

目录 经典摘录 领导方式有两种 拖拉 决心&#xff1a;克服拖拉的坏习惯&#xff08;通往致富之路的第七步&#xff09; 毅力&#xff1a;催生信念的持久努力&#xff08;通往致富之路的第八步&#xff09; 智囊团的力量&#xff1a;致富驱动力&#xff08;通往致富之路的第…

【分享】你用免费的GPT4了嘛?

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 现在OpenAI的ChatGPT4需要升级为plus会员使用&#xff0c;对于国内的用户来说&#xff0c;不仅需要魔法&#xff0c;还需要有一张外网的信用卡来开通会员&#xff0c;真的麻烦。 最近木易巷发现了一个项目&#xff0c;是GitHu…

基于欧式距离的聚类算法的Kmeans作业

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 基于欧式距离的聚类算法&#xff0c;其认为两个目标的距离越近&#xff0c;相似度越大。 该实验产生的点为二维空间中的点。 环境配置 java环境&#xff0c;使用原生的Java UI组件JPanel和JFrame 算法原理 基于欧式距离的聚…

问卷调查类型全面解析

调查问卷是从人们那里收集反馈和意见的强大工具。通过提出结构化问题&#xff0c;研究人员、组织和企业可以获得大量有关如何改进产品或服务、解决问题或做出明智决策的信息。但在设计调查问卷之前&#xff0c;必须首先了解不同的类型以及何时使用它们。 1、结构化问卷 结构化…

秀场、卖场、生态场,长沙为何连展会也与众不同?

文 | 智能相对论 作者 | 易不二 第三届长沙国际工程机械展览会已经完美落下帷幕。 依托长沙作为“工程机械之都”的硬核产业实力&#xff0c;又经过了多年耕耘&#xff0c;长沙国际工程机械展已经达到了跻身全球一流展会的水平。 4天的展期里&#xff0c;全球1502家企业参展…

【产品经理】产品体验报告准备

假如你已经决定为一个app写一份产品体验报告了&#xff0c;那么&#xff0c;我想说的是&#xff0c;不要急着动笔&#xff01; 下面就进入正题&#xff0c;在写产品体验报告之前&#xff0c;我会先去做哪些准备工作&#xff1a; &#xff08;1&#xff09;下载、把玩并熟悉app…

15-03 软件安全

系统安全 系统安全威胁 病毒蠕虫特洛伊木马Rootkit后门僵尸网络零日攻击Webshell 操作系统防御 杀毒软件&#xff1a;兵来将挡&#xff0c;水来土掩升级补丁&#xff1a;防止零日攻击限制&#xff1a;用户、网络、端口、程序、安全基准、不可变基础架构 杀毒软件检测机制 …

【猿人学WEB题目专解】猿人学第18题

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…