对象的属性和行为在C++中分别对应类的成员变量和成员函数,区分依据是定义位置、访问方式及内存/调用机制;属性常置于private/protected区,行为多置于public区以符合封装惯例。

对象的属性和行为在 C++ 中本质就是类里的成员变量和成员函数,区分它们不靠语法关键词,而靠定义位置、访问方式和内存/调用机制。
看声明位置和访问权限修饰符
属性(成员变量)通常出现在 private 或 protected 区域,行为(成员函数)多放在 public 区域——这不是硬性规定,但符合封装惯例。比如:
class Student {
private:
string m_name; // 属性:被保护,外部不能直接读写
int m_id;
public:
void set_name(string n) { m_name = n; } // 行为:提供对外接口
void print() { cout << m_name << endl; } // 行为:封装了对属性的使用
};
注意:m_name 是变量名,set_name 是函数名,名字本身常带提示(如 m_ 前缀、get_/set_ 前缀),但这只是约定,编译器不强制。
看调用方式和 this 指针隐含传递
行为必须通过对象(或指针/引用)调用,且每次调用都会自动传入 this 指针;属性则可直接通过点号或箭头访问,但仅限于有访问权限时:
立即学习“C++免费学习笔记(深入)”;
-
s1.m_name—— 直接访问属性(需public权限) -
s1.print()—— 调用行为,编译器实际转成print(&s1) -
s1.set_name("Alice")—— 行为内部通过this->m_name修改自身属性
静态成员例外:Student::s_count(静态变量)和 Student::create()(静态函数)不依赖具体对象,也无 this。
看内存布局和生命周期
属性是对象的一部分,每个对象实例都有一份独立拷贝,存于栈或堆上;行为是代码,所有对象共享同一份函数体,存于代码段:
-
Student s1, s2;→s1.m_name和s2.m_name是两块不同内存 -
s1.print()和s2.print()调用的是同一段机器码 - 若属性是
static(如static int s_total;),它不属于任何对象,而是属于整个类,全局唯一
容易忽略的一点:没有 public 修饰的类成员默认是 private,所以即使你写了 string name; 在 class 里没加访问符,它也是私有属性,不能直接用 obj.name 访问。


















