🏷️ 标签:C++、面向对象、类、构造函数、成员函数、封装、继承、多态
📅 更新时间:2025年6月15日
💬 欢迎在评论区留言交流你的理解与疑问!

文章目录

  • 前言
  • 一、什么是类?
  • 二、类的定义
    • 1.基本语法
    • 2.示例
      • 1.学生类
      • 2.详解构造函数
      • 3.实例化对象
  • 三、访问权限 public / private / protected
    • 1.各类权限含义
    • 2.示例
  • 四、构造函数
    • 1.类型
    • 2.示例
  • 五、析构函数
    • 1.语法
    • 2.示例:
  • 六、类的友元
    • 1.什么是友元
    • 2.示例
    • 3.友元函数
      • 1.语法
      • 2.示例
  • 总结


前言

C++ 入门老是绕不过类与对象构造函数是什么成员函数怎么写访问权限有啥用
今天我们就来学习一下c++中的类


一、什么是类?

在 C++ 中,(Class)是一种用户自定义的数据类型用于将数据和行为封装在一起

类是模板,对象是实例

就像学生是一种类型,而“张三”“李四”是一个个对象

二、类的定义

1.基本语法

class 类名 {//访问权限!!!!!!!!
private/public/protected:   // 构造函数// 成员函数private/public/protected:// 成员变量};

2.示例

1.学生类

我们创建一个表示学生的类

#include <iostream>
using namespace std;class Student {public://构造函数Student(string n, int a) {name = n;age = a;}//成员函数void introduce() {cout << "我是 " << name << ",今年 " << age << " 岁。" << endl;}//私有变量
private:string name;int age;};

2.详解构造函数

构造函数是一个特殊的成员函数当对象被创建时自动调用常用于初始化成员变量
要求:
名称必须与类名相同
没有返回值

Student(string n, int a) {name = n;age = a;
}

同样初始化我们可以通过初始化列表的方式进行初始化

Student(string n, int a):name(n),age(a) {// 构造函数体可留空,推荐用初始化列表初始化成员变量
}

我们还能用this指针来初始化
在成员函数中,this 是一个指向当前对象本身的指针

Student(string n, int a) {this->name = n;this->age = a;
}

3.实例化对象

我们可以在主函数中创建一个实例对象,然后调用其中的成员函数

int main()
{Student s1("小明",20);s1.introduce();return 0;
}输出:
我是 小明,今年 20 岁。

三、访问权限 public / private / protected

1.各类权限含义

public:公有成员,可以被所有代码访问。
private:私有成员,仅能被类的成员函数和友元访问。
protected:受保护成员,仅能被类的成员函数、友元和派生类访问。
在这里插入图片描述默认是 private,推荐显式写出访问权限,增强可读性

2.示例

我们还是拿前面的学生类来举例,我们在构造函数中对于成员变量成员函数我们都用public,这样我们就能在类外访问到了

正确示范:

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}void introduce() {cout << "我是 " << name << ",今年 " << age << " 岁。" << endl;}public:string name;int age;};
int main()
{Student s1("小明",20);s1.introduce();cout<<"年龄:"<<s1.age<<endl;cout<<"名字:"<<s1.name<<endl;return 0;
}
输出:
我是 小明,今年 20 岁。
年龄:20
名字:小明

错误示范:

private://改为私有string name;int age;

此时会报错

a.cpp:27:24: error:int Student::age’ is private within this context27 |    cout<<"年龄:"<<s1.age<<endl;|                        ^~~
a.cpp:20:13: note: declared private here20 |         int age;|             ^~~
a.cpp:28:24: error: ‘std::string Student::name’ is private within this context28 |    cout<<"名字:"<<s1.name<<endl;|                        ^~~~
a.cpp:19:16: note: declared private here19 |         string name;|                ^~~~

因为类外不可以访问!

四、构造函数

1.类型

默认构造函数:没有参数的构造函数。
参数化构造函数:接受参数以初始化对象。
拷贝构造函数:用一个对象初始化另一个对象。
移动构造函数(C++11):从临时对象“移动”资源

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;cout<<"参数化构造函数"<<endl;}Student(){name="小明";age=10;cout<<"默认构造函数"<<endl;}Student(const Student &other){name=other.name;age=other.age;cout<<"拷贝构造函数"<<endl;}Student(Student&& other){name=other.name;age=other.age;cout<<"移动构造函数"<<endl;}private:string name;int age;};
int main()
{Student s1;Student s2("小明",20);Student s3=s2;Student s4=move(s3);return 0;
}

输出:

默认构造函数
参数化构造函数
拷贝构造函数
移动构造函数

五、析构函数

析构函数(Destructor):在对象生命周期结束时调用,用于释放资源

1.语法

~ 类名 ()
{
}

2.示例:

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;p=new int(age);//手动开辟 在堆上}~Student(){delete p;//手动开辟必须手动释放}private:string name;int age;int* p;};

六、类的友元

1.什么是友元

友元(Friend):可以访问类的私有保护成员的非成员函数或另一个类

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}~Student(){}private:string name;int age;friend class teacher;//关键声明!!!!!!!!!!!!void play(){cout<<"hi"<<endl;}
};class teacher
{public:teacher(string name,int age){this->name=name;this->age=age;}~teacher(){}void f( Student& a){a.play();//直接访问私有成员函数}private:string name;int age;
};int main()
{teacher s1("小明",20);Student s2("小明",20);s1.f(s2);return 0;
}输出:hi

如果没有声明

friend class teacher;

那么在teacher的成员函数中这样直接访问是错误的

void f(Student& a){a.play();//直接访问私有成员函数}

3.友元函数

友元函数: 单个函数可以被声明为友元

这样我们可以在函数内访问私有变量

1.语法

friend 函数()
{}

然后函数如果要在类外实现的话
不需要
void 类:: 函数名(){}
因为友元函数并不是类的成员函数

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}~Student(){}friend void play(Student& a) ;//声明友元函数private:string name;int age;
};void play(Student& a)//类外实现友元函数
{cout<<a.name<<endl;//调用私有变量
}int main()
{Student s2("小明",20);play(s2);return 0;
}
输出:小明

总结

类(Class)是 C++ 中封装数据和行为的基本单位,是面向对象编程的核心概念。

对象是类的实例,通过构造函数进行初始化,支持默认构造、参数构造、拷贝构造和移动构造。

访问权限决定了类成员的访问范围:public(公有)、private(私有)、protected(保护),良好的封装性是面向对象设计的重要原则。

构造函数负责初始化对象,析构函数负责资源释放,两者构成对象生命周期管理的基础。

友元(函数或类) 是类提供的一种特殊机制,允许非成员函数或其他类访问私有和保护成员

友元函数不是类的成员函数,定义时不需要加类名作用域限定符

如果你觉得本文对你有帮助,不妨点赞 + 收藏 + 关注,更多 C++ 系列教程将持续更新 🔥!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE与Jakarta EE命名空间区别

在 Java 生态中&#xff0c;javax 和 jakarta 代表了 企业级 Java 规范&#xff08;Java EE/Jakarta EE&#xff09;的命名空间演进&#xff0c;核心区别在于归属权和管理组织的变更。以下是详细对比&#xff1a; 1. 历史背景 javax&#xff1a; 源自 Java EE&#xff08;Java …

2 Studying《Arm A715 Technical Reference Manual》

目录 2. The Cortex‑A715 core 2.1 Cortex‑A715 core features 2.2 Cortex‑A715 core confifiguration options 2.3 DSU-110 dependent features 2.4 Supported standards and specifications 2.6 Design tasks 3. Technical overview 3.1 Core components 3.2 Int…

使用Nodejs尝试小程序后端服务编写:简单的待办事项管理demo

文章目录 结构demo步骤demo运行效果API测试(1) 添加待办事项(2) 获取所有待办事项(3) 切换完成状态(4) 删除待办事项 API测试-RESTClient一些其他的高级功能环境变量管理不同环境配置授权认证 测试需要登录的接口保存响应测试脚本编写自动化测试 bug解决 结构 尝试写一个简单的…

CSS“多列布局”

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​col…

Pump上狙击机制的功能优势和实战教学

加密世界的发展永远伴随着速度的革命。无论是新的 Token 上线&#xff0c;还是热点项目的第一波流动性注入&#xff0c;抢先一步往往意味着利润的几何级增长。在这个讲究「秒杀」与「先机」的赛道中&#xff0c;一项关键策略正悄然成为链上操作者的常规武器——狙击&#xff08…

条件收敛的级数中项必须趋于 0,正负项抵消,但趋于 0 的速度不需要“足够快”

条件收敛的级数中&#xff0c;项必须趋于 0&#xff0c;但趋于 0 的速度不需要“足够快”的原因可以从以下几个方面理解&#xff1a; 1. 收敛的必要条件&#xff1a;项趋于 0 对于任何收敛的级数&#xff08;无论是绝对收敛还是条件收敛&#xff09;&#xff0c;都必须满足 li…

Tomcat 和 Spring MVC

Tomcat 和 Spring MVC 是 Java Web 开发中两大核心组件&#xff0c;分别承担不同的角色&#xff1a; 一、Tomcat 定义 Apache Tomcat 是一个开源的 Servlet 容器&#xff08;也称为 Servlet 引擎&#xff09;&#xff0b; JSP 引擎&#xff0c;实现了 Java EE&#xff08;现称 …

【微服务】134:SpringCloud

今天是刘小爱自学Java的第134天。 感谢你的观看&#xff0c;谢谢你。 image 学习内容安排如下&#xff1a; SpringCloud的接触。利用SpringCloud搭建微服务架构&#xff0c;当然这个估计要3天时间才能完成&#xff0c;今天主要是注册中心Eureka的学习。 一、SpringCloud 微服务…

三次贝塞尔曲线,二次贝塞尔曲线有什么区别

三次贝塞尔曲线和二次贝塞尔曲线在控制点数量、数学表达式和曲线复杂度上有所不同。以下是它们的主要区别&#xff1a; 1. 控制点数量 二次贝塞尔曲线&#xff1a;由3 个点定义&#xff08;起点、终点和 1 个控制点&#xff09;。三次贝塞尔曲线&#xff1a;由4 个点定义&…

springboot集成dubbo

BeanDefinitionRegistryPostProcessor public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {/*** 允许开发者在Spring容器加载Bean定义(BeanDefinition)后&#xff0c;实例化Bean之前&#xff0c;动态修改或注册新的BeanDefinition* 该接…

Seata 全面深入学习指南

Seata 全面深入学习指南 学习目录 第一部分:Seata 基础篇 分布式事务基础概念Seata 概述与核心架构Seata 部署与快速入门第二部分:Seata 核心机制 Seata 事务模式详解 AT 模式TCC 模式SAGA 模式XA 模式Seata 事务协调机制Seata 高可用设计第三部分:Seata 高级特性 Seata 配…

【Linux】基于策略模式的简单日志设计

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——基于策略模式的简单日志设计 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语…

C#引用传递代码记录

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 值传递和引用传递 {internal class Program{static void Main(string[] args){person P1new person();P1.name "张三";person P2 …

React动态渲染:如何用map循环渲染一个列表(List)

React动态渲染&#xff1a;如何用map循环渲染一个列表(List)&#xff1f; 系列回顾&#xff1a; 在上一篇中&#xff0c;我们学习了如何通过onClick等事件处理&#xff0c;让React应用响应用户的操作。现在我们的组件已经能“听懂话”了。但是&#xff0c;目前为止我们展示的内…

React Native【实战范例】水平滚动分类 FlatList

import React from "react"; import { FlatList, SafeAreaView, StyleSheet, Text, View } from "react-native"; interface itemType {id: string;title: string;icon: string; } // 水平滚动数据 const horizontalData: itemType[] [{ id: "1"…

iOS swiftUI的实用举例

SwiftUI 是 Apple 推出的声明式 UI 框架&#xff0c;以下是一些实用技巧和最佳实践&#xff0c;可以帮助你更高效地开发 iOS/macOS/watchOS/tvOS 应用。 1. 布局技巧 灵活的空间占用 // 使用 Spacer 填充可用空间 HStack {Text("Left")Spacer() // 填充中间空间 …

SpringMVC异步处理Servlet

使用SpringMVC异步处理Servlet解决的问题 可以不阻塞有限的tomcat 线程&#xff08;默认是200~250个&#xff0c;springboot3是200个&#xff09;&#xff0c;确保网络请求可以持续响应特定业务使用自定义线程池&#xff0c;可以处理的业务量更大对上层业务完全无感知&#xf…

同步与异步编程范式全景研究——从CPU时钟周期到云原生架构的范式演进

第一章 时空观的根本分歧 1.1 物理时间的约束性 同步操作的本质是对牛顿绝对时间的服从&#xff0c;其阻塞特性源于冯诺依曼体系下指令顺序执行的基因。现代CPU的流水线技术&#xff08;如Intel Hyper-Threading&#xff09;通过指令级并行实现伪异步&#xff0c;但开发者仍需…

【零散技术】5分钟完成Odoo18 登陆页面全自定义

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 从最初的tinyERP到Open ERP&#xff0c;再由OpenERP到Odoo&#xff0c;虽然UI已经过了多次大改&#xff0c;Odoo登录界面依旧丑陋&#xff0c;同时还有各种Odoo版权信息&#xff0c;对于定制项目而言是不友好的。 今天以Odoo18…

Vue3 + TypeScript + Element Plus + el-pagination 分页查询实例分享

前端技术栈&#xff1a;Vue3 TypeScript Element Plus el-pagination 后端技术栈&#xff1a;Java Spring Boot Mybatis 应用异常情况说明&#xff1a;点击页码2&#xff0c;会发送两次请求&#xff0c;并且自动跳回页码1 代码&#xff1a; Reagent.vue <script set…