博客
关于我
类的对象定义和使用(含指针对象)
阅读量:534 次
发布时间:2019-03-08

本文共 1617 字,大约阅读时间需要 5 分钟。


在C++编程中,类的指针和对象是非常基础但又是容易混淆的概念。理解它们的区别,是每一个学习C++的人都需要掌握的核心技能。

1. 指针与对象的内存分配

类的指针是用new运算符为类实例分配内存的工具。例如:

Student* s1 = new Student();

这里,s1的值是内存地址,指向一个由Student构造函数初始化的对象。这个对象包含了类中定义的成员变量及其初始化值,比如:

Student s1;

唯一的区别在于,使用new分配的对象存储在堆内存中,而不是栈内存。

2. 引用成员的方式

类的指针和对象的成员引用方式在某些方面有所不同。

  • 对于对象,你可以使用点号.来直接引用成员:
    Student s2;s2.name = "张三";
  • 而对于类的指针,你需要使用->运算符来访问成员:
    Student* s1 = new Student();s1->name = "李四";

如果忘记使用->运算符,而是用.去访问指针成员,程序就不会被编译,会报错。

3. 存在方式的区别

  • 对象:在函数内声明的类实例,存活于函数的局部作用域,其生命周期由函数控制。

    void func() {    Student s3;    // 在这函数结束后,s3会自动释放内存}
  • 类的指针:用newmalloc分配的内存存活在程序运行的内存中,除非显式使用delete释放内存。

    Student* s4 = new Student();// 需要在适当的时候使用 delete 释放内存delete s4;

如果忘记释放分配的内存,程序会因为内存泄漏而崩溃。

4. 内存管理要点

  • 对象:因为它们定义在线函数内部,C++会自动调用析构函数释放内存,不存在内存泄漏问题。
  • 指针:需要手动使用delete释放内存,避免内存泄漏。

例如:

// 正确方式Student* s1 = new Student();// ...delete s1;

而忘记释放的代码则会引发内存泄漏。

5. 对于成员函数的调用

  • 对于对象,可以直接使用点号调用成员函数:
    s2.print();
  • 对于指针,需要使用->运算符:
    s1->print();

在实际开发中,到底选用对象还是指针,要看具体需求。对象在大多数情况下更容易使用,但如果需要高并发或对象频繁创建销毁,指针可能会更高效。

6. 代码示例

// 定义类class Student {private:    static int number;    string name;public:    Student() {}    void set(string str) {        name = str;        Static Data Member Increment;    }    void print() {        std::cout << name << ": The number of the students is "                   << number << " numbers." << std::endl;    }};int Student::number = 0;int main() {    Student* s1 = new Student();    s1->set("111");        Student s2;    s2.set("222");        s1->print();    s2.print();        delete s1;    return 0;}

这段代码展示了如何使用类的指针和对象,并通过static关键字定义了静态数据成员 number。要记住的是,new分配的是指针对象,而不是对象本身。


通过以上知识和示例,您可以更好地理解类的指针和对象的区别,从而在实际开发中灵活运用。

转载地址:http://rvsiz.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0020---Selectionkey在NIO体系
查看>>
Vue踩坑笔记 - 关于vue静态资源引入的问题
查看>>
Netty工作笔记0024---SelectionKey API
查看>>
Netty工作笔记0025---SocketChannel API
查看>>
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0028---NIO 网络编程应用--群聊系统3--客户端编写1
查看>>
Netty工作笔记0034---Netty架构设计--线程模型
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0057---Netty群聊系统服务端
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0072---Protobuf内容小结
查看>>
Netty工作笔记0074---handler链调用机制实例1
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0081---编解码器和处理器链梳理
查看>>
Netty工作笔记0083---通过自定义协议解决粘包拆包问题1
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>