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

类定义必须包含访问控制和成员声明
在 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";
}};
-
name和age是公有数据成员,可直接通过对象点号访问 -
introduce()是公有成员函数,可在类外调用 - 不写
public:就无法从main()中读写name或调用introduce()
实例化对象时注意括号与初始化语法差异
对象实例化不是函数调用,带括号不一定等于调用构造函数。C++ 有多种写法,语义不同:
立即学习“C++免费学习笔记(深入)”;
-
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),编译能过但行为完全不是你想要的。
成员函数内访问成员变量无需额外修饰
在类的非静态成员函数中,直接写 name 或 age 就等价于 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)的要求。











