C++中类和对象的浅析

类是创建对象的蓝图,描述对象的属性和方法;对象是类的实例,通过类可以创建具有相同特征的多个对象。在C++中,类可以通过public和private关键字控制数据成员的访问权限。对象可以在栈或堆上实例化,栈上实例化由编译器自动管理内存,而堆上实例化需要程序员手动使用new和delete管理内存,避免内存泄漏。
摘要由CSDN通过智能技术生成

什么是类?什么是对象?

类:在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

对象:通过类创建出对象,又称实例化对象。

怎么简单的使用一个类?

定义一个学生类

#include <iostream>
#include <string>

using namespace std;

class Student
{
public:
    Student() {} //为什么构造函数和析构函数后面不需要加分号?
    ~Student() {}

    void setName(string name)
    {
        this->name = name; 
    }

    string getName()  const {return name;};//q2:请为什么这里加了分号,下面没有加分号

    void setAge(int age ) {this->age = age;}
    int getAge() const {return age;}

private:
    string name;
    int age;
};

/*
q1: 刚才试了一下,发现加上和不加都可以通过编译,淦,麻了
q2:个人理解有了{}之后就可以不用加了,反正都是代表函数的结束,你有一个也是表示这个语句到此结束,两个也是一样
*/

定义类的注意事项

  1. 定义一个类时,开头时需要使用关键字 class 来进行修饰,在类的最后(大括号后)必须要有一个分号。
  2. 一个简单的类可以没有构造函数和析构函数,但是系统自动生成一个默认的构造函数和析构函数,反正这两个函数一定会有,没有就不行。
  3. 在类中使用关键字 public 、 private 和 protected 来限制数据成员和成员函数,一般使用 public 和 private 来修饰数据成员和成员函数。
  4. 一般将数据成员封装在 private 关键字下,不让用户直接访问数据成员,而是通过成员函数来进行访问。

类怎么实例化,实例化后类存储在哪里

栈上实例化
Student stu1; //栈上实例化对象的方法就是:类名 对象
stu1.setName("jake");
stu1.setAge(15);
cout << "My name is " << stu1.getName() << ", I'm " << stu1.getAge() << " years old." << endl;

栈上实例化对象的过程:先由编译器为对象在栈空间分配内存,移动栈顶指针,挪出适当的空间,然后在这个空间上调用构造函数形成一个对象,在对象使用完之后,调用析构函数回收内存,栈顶指针减一

堆上实例化
Student *stu2 = new Student;//堆上实例化对象的方法就是 类名 指针 = new 类
stu2->setName("siri");
stu2->setAge(5);
cout << "my name is " << stu2->getName() << ", i am " << stu2->getAge() << " years old." << endl;

delete stu2;//如果我不使用delete会发生什么?程序会不会自动释放空间
/*
new 之后, 如果不delete. 那么在进程未结束之前, 这些内存就泄漏了, 不是系统不能回收它. 当进程结束时, 进程所分配的内存会被系统回收, 但仅仅是回收内存, 系统并不关心你程序里面是如何使用它的, 也就是说, 它并不会像楼主想的那个, 系统回收内存的时候, 还会调用析构函数. 只有程序内部调用delete才会调用析构函数. delete过程实际是这样的. (假设delete的是一个对象指针) 首先: 调用对象的析构函数 然后: 调用free类似的内存释放函数, 告诉系统, 这块内存我用完了, 还给你. 在进程结束时应该是这样: 系统说: 你都死了, 东西全部归国有.
*/
stu2 = nullptr;//为什么这里要指向null
/*
指针在栈里放着,如果不指向null,那么再次使用指针时会指向这块内存,那时候这块内存放的什么东西,都不知道,
*/
c++程序运行时,占用内存的组成部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。

5、程序代码区 — 存放函数体的二进制代码。

具体细节看一看这一篇文章https://zhuanlan.zhihu.com/p/88151799

类是怎么存储的?

​ C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。全局数据区存放全局变量,静态数据和常量;所有类成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。根据这个解释,我们可以得知在类的定义时,类成员函数是被放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

类有哪些基础的属性?

概念描述
构造函数类的构造函数是一种特殊的函数,在创建一个新的对象时自动调用
析构函数类的析构函数也是一种特殊的函数,在删除所创建的对象时自动调用
拷贝构造函数拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象
友元函数友元函数可以访问类的 private 和 protected 成员
内联函数通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码
类成员函数类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样
类访问修饰符类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private
this 指针每个对象都有一个特殊的指针 this,它指向对象本身
静态成员类的数据成员和成员函数都可以被声明为静态的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值