C++类与对象初始篇

目录

前言

 1.什么是面向过程和面向对象

2.类的引入 

 3.类的定义

4.访问限定符及其封装

5.类的作用域实例化及其模型

 5.1作用域

 5.2实例化

5.3类的模型

 5.3.1如何计算类对象大小

5.3.2 类对象的存储方式


前言

学到这里,我在思考一个问题,C语言和C++有什么区别,C++的语法看着相比较C语言来说比较复杂,引入了很多新的概念,但是在之前的知识里面,学到的输入输出、引用、缺省参数、函数重载等等,并没有实际看到C++的强大之处,那么本章就会进入C++语法的核心基础,类和对象。

 1.什么是面向过程和面向对象

简单来说,C语言通过一些函数调用来解决问题,比如判断一个素数,实现一个顺序表来存储数据呀,这些都是对每一个对象的过程批量操作,重点在于过程,C++面向对象就是,基于对象,由对象之间的交互来完成。

2.类的引入 

 下面是用C语言和C++写的两个结构体,比较看看两者之间有什么不同呢?

 

 这里会不会有小读者说明显可以看出来,头文件不一样,当然这是最小的一个点啦,其实是相比较于C语言C++在定义链表的时候可以直接在内部定义结构体,而不需要struct,原因在于在C语言中还是结构体,但是在C++中被升级了类,类的引入开始咯!

 3.类的定义

class Data
{
	//类体成员函数和变量
};//分号!!!
class 定义类的 关键字, ClassName 为类的名字, {} 中为类的主体,注意 类定义结束时后面 分号
类中的元素称为 类的成员: 类中的 数据 称为 类的属性 或者 成员变量 ; 类中的 函数 称为 类的方法 或者 成员函数

类的两种定义方式:

1.声明和定义全部放在类体里面,这样编译器会将成员函数,当成内联函数处理。

 2. 声明放在.h文件中,类的定义放在.cpp文件中(推荐使用)

两者有什么区别呢?

如果所定义的函数比较短,且没有循环和递归,便可以函数声明与定义放在一起.

如果所定义的函数比较长,且含有循环或者递归,那么函数必须声明与定义分离.

原因是,如果成员函数在类的内部定义,编译器会把函数当成内联函数进行展开.如果含有递归或者循环,可能会被忽略.

学会类的定义了,咱们练习一下吧!,定义一个 类person,成员变量有体重,然后成员函数就是体重一直减,减到120停止。

#pragma once
#include<iostream>
using namespace std;
class Person
{
public:
	void loseweight(int weight);
	

private:
	int _weight;
};//.h头文件

------------------------------------
#include"Test.h"
void Person:: loseweight(int weight)
{
	_weight = weight;
	while (weight>=120)
	{
		cout << weight << "继续加油!同志" << endl;
		weight--;
	}
	cout << "减肥成功!" << endl;
}//头文件对应的源文件.cpp
------------------------------------
#include"Test.h"
int main()
{
	Person ZB;
	ZB.loseweight(130);
	return 0;
}//主函数

 实现效果:

4.访问限定符及其封装

 其中,这里博主要先介绍下类访问限定符:public(公有),protected(保护),private(私有),其中public的作用是无论类内还是类外,都可以访问类的属性和方法,后两者的作用是类外不能访问,类内可以访问,至于后两者区别是什么?博主在后面的章节会详细介绍.

1. public 修饰的成员在类外可以直接被访问
2. protected private 修饰的成员在类外不能直接被访问 ( 此处 protected private 是类似的 )
3. 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class 的默认访问权限为 private struct public( 因为 struct 要兼容 C,在C++中可以使用struct)

 理解问题:C++structclass的区别是什么?

回答:在C++中,struct的成员默认访问方式是publicclass是的成员默认访问方式是 private。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。

封装本质上就是一种管理,像动物园一样,把小动物管理起来,在特定的时间通过一些窗口(成员函数)可以去看到(访问)那些动物,

5.类的作用域实例化及其模型

 5.1作用域

类定义了一个新的作用域 ,类的所有成员都在类的作用域中 在类体外定义成员,需要使用 :: 作用域解析符 指明成员属于哪个类域。

 5.2实例化

用类类型创建对象的过程,称为类的实例化
1. 类只是 一个 模型 一样的东西,限定了类有哪些成员,定义出一个类 并没有分配实际的内存空间 来存储它
2. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
3. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什 么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占 用物理空间

5.3类的模型

 猜猜这个会输出什么样的结果?你肯定会回答相同!那这样呢?

 

 答案还是相同啦!

 5.3.1如何计算类对象大小

其实类的大小计算和在c语言中结构体计算方法一模一样,并且只计算成员属性,成员方法不需要计算. 

5.3.2 类对象的存储方式

一个类一般是包括成员属性和成员方法的,那么其实例出的对象,会是怎样存两者的呢? 

回答: 每个对象都会存储其成员属性,但不会存储成员方法,而类的成员方法是放在一个公共区域(代码段)中.每个对象都有不同的属性(属性值不一样),但是他们的方法确是一样的(方法定义上),而不同的对象,我们只需要知道其属性,然后需要哪个方法就去公共区域调用哪个方法,这将会极大的节约空间.反之,如果每个对象都存储一个相同的方法,就会造成极大的空间浪费。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在C/C++开发中,对象变量的生命周期管理非常重要。对于一个程序,对象的生命周期涉及到内存的分配和释放,如果管理不当,可能会导致内存泄漏和程序崩溃等问题。因此,本文章将为大家详细介绍如何在C/C++开发中管理对象变量的生命周期。 一、对象的创建和销毁 在C/C++中,对象的创建和销毁是由构造函数和析构函数来完成的。构造函数用于初始化对象的各个成员变量,而析构函数则用于释放对象占用的内存空间和资源。下面是一个简单的示例代码: ```c++ class MyClass{ public: // 构造函数 MyClass(){ // 初始化成员变量 } // 析构函数 ~MyClass(){ // 释放资源 } }; ``` 在上述代码中,MyClass是一个类,它包含了一个构造函数和一个析构函数。当程序实例化MyClass对象时,构造函数会被调用,用于初始化对象的成员变量;当程序销毁MyClass对象时,析构函数会被调用,用于释放对象占用的内存空间和资源。 二、堆和栈的区别 在C/C++中,对象的生命周期还涉及到堆和栈的使用。堆和栈都是内存空间,但它们在使用上有着很大的区别。 栈内存是由系统自动分配和释放的,程序员不能主动控制。当程序进入一个函数时,它会为该函数的局部变量和参数在栈内存中分配一段空间,当函数执行完毕后,这些空间会自动被释放。因此,栈内存的生命周期是由系统自动管理的。 而堆内存则需要程序员手动分配和释放。程序员可以使用new操作符在堆内存中分配一段空间,并使用delete操作符释放这些空间。因此,堆内存的生命周期是由程序员手动控制的。 三、内存泄漏和野指针 在C/C++开发中,内存泄漏和野指针是非常常见的问题。内存泄漏指程序中使用了动态分配的内存空间,但在使用完毕后未释放,导致内存资源无法被回收。野指针则是指指向已经释放的内存空间或者未初始化的内存空间,这种指针的使用会导致程序崩溃或者产生未知的错误。 为避免内存泄漏和野指针等问题,程序员需要注意以下几点: 1. 确保每个new操作都有对应的delete操作,避免动态分配的内存空间无法释放。 2. 不要使用已经释放的内存空间,避免野指针的产生。 3. 对于堆内存中分配的对象,需要在对象的生命周期结束时手动释放内存空间。 4. 对于栈内存中的对象,不需要手动释放内存空间,因为它们的生命周期是由系统自动管理的。 四、对象引用和拷贝 在C/C++中,对象引用和拷贝也是需要注意的问题。对象引用是指使用一个对象的别名来访问该对象,而对象拷贝则是指将一个对象的值复制到另一个对象中。 对于对象引用,程序员需要注意以下几点: 1. 对象引用不会占用额外的内存空间,它只是原对象的别名,因此在使用对象引用时要确保原对象的生命周期长于对象引用。 2. 对象引用不能指向空对象或已经释放的对象,否则会产生野指针。 对于对象拷贝,程序员需要注意以下几点: 1. 对象拷贝会占用额外的内存空间,因此在使用对象拷贝时要注意内存的分配和释放。 2. 对于类中包含指针成员变量的情况,需要自定义拷贝构造函数和赋值运算符,防止浅拷贝和指针重复释放等问题。 总之,在C/C++开发中,对象变量的生命周期管理是非常重要的。程序员需要注意对象的创建和销毁、堆和栈的使用、内存泄漏和野指针、对象引用和拷贝等问题,从而保证程序的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值