0

0

c++中如何定义并使用类_c++类的定义与实例化

冰火之心

冰火之心

发布时间:2026-01-08 15:07:02

|

107人浏览过

|

来源于php中文网

原创

C++类定义必须显式声明访问控制符,否则默认private;最小可用类需含public:及成员;对象实例化语法多样,Person p()是函数声明而非对象定义;成员函数内直接访问成员变量,同名时用this->区分;头文件需防重复包含。

c++中如何定义并使用类_c++类的定义与实例化

类定义必须包含访问控制和成员声明

在 C++ 中,class 关键字后必须显式写出 public:private:protected:,否则所有成员默认为 private,外部无法访问。常见错误是直接写成员变量或函数而忘记访问标号,导致编译报错 error: 'xxx' is private within this context

一个最小可用的类定义长这样:

class Person {
public:
    std::string name;
    int age;
void introduce() {
    std::cout << "I'm " << name << ", " << age << " years old.\n";
}

};

  • nameage 是公有数据成员,可直接通过对象点号访问
  • introduce() 是公有成员函数,可在类外调用
  • 不写 public: 就无法从 main() 中读写 name 或调用 introduce()

实例化对象时注意括号与初始化语法差异

对象实例化不是函数调用,带括号不一定等于调用构造函数。C++ 有多种写法,语义不同:

立即学习C++免费学习笔记(深入)”;

达奇AI论文写作
达奇AI论文写作

达奇AI论文辅助写作平台,在校学生、职场精英都在用的AI论文辅助写作平台

下载
  • Person p1; —— 默认构造(即使没显式定义,编译器也会合成)
  • Person p2{"Alice", 25}; —— 聚合初始化(仅当类无用户定义构造函数且全是公有成员时有效)
  • Person p3 = Person{"Bob", 30}; —— 拷贝初始化(触发移动或拷贝,C++17 后通常被优化掉)
  • Person* p4 = new Person{"Charlie", 35}; —— 堆上分配,需手动 delete

特别注意:Person p(); 不是定义对象,而是声明了一个返回 Person 的函数 —— 这叫“最令人烦恼的解析”(most vexing parse),编译能过但行为完全不是你想要的。

成员函数内访问成员变量无需额外修饰

在类的非静态成员函数中,直接写 nameage 就等价于 this->name。不需要也不应该加 this-> 前缀,除非存在同名局部变量或参数需要区分:

void set_name(const std::string& name) {
    this->name = name; // 必须用 this-> 区分参数和成员
}
  • 如果参数名不叫 name(比如叫 n),就可以直接写 name = n;
  • this 是隐式传入的指针,不能在静态成员函数里用
  • 把成员变量命名成 m_name_name 是常见风格,但和语言机制无关

头文件中定义类要防止重复包含

如果把类定义放在头文件(如 person.h)里,又在多个 .cpp 文件中 #include 它,必须加 include guard 或 #pragma once,否则链接时报错 multiple definition of 'Person::introduce()'(尤其当成员函数体在头文件中时)。

  • 推荐写法:#pragma once 放在 person.h 第一行
  • 传统写法:#ifndef PERSON_H / #define PERSON_H / #endif
  • 函数实现尽量放 .cpp 文件里;若必须内联(如模板类),确保只定义一次

类本身定义可以多次出现(只要一致),但成员函数的定义(有函数体的)只能有一次,这是 ODR(One Definition Rule)的要求。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

324

2023.10.11

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

567

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

462

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

12

2025.12.06

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

53

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号