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

12次阅读

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++免费学习笔记(深入)”;

  • 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)的要求。

text=ZqhQzanResources