IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 类和对象初学 -> 正文阅读

[C++知识库]类和对象初学


类就像一个集装箱,将同一种事务放在同一个地方。

相当于小明,小红等都属于人这个大类。而小明,小明在c++中又被称为对象。

拿小明来举例子:

小明有他自己的身高,体重,年龄,这些都是小明有的称为对象的属性。当小明在自我介绍的时候需要说出自己的相关信息,说这个动作称为行为,在程序中通过函数来实现。

所以类就由2个部分组成对象属性和对象行为(也称为成员属性和成员函数)。

大致的代码如下(忘记加public了)

通过在主函数中可以创造对象与结构体类似

class person student//class可以省
student.name="xiaoming"
student.weight=90.5;
student.age=18;

说道结构体,会发现类(class)和struct用法十分相似,二者最本质的区别就是权限不一样。

类一共有3个权限:

public:公开 (类内外都可以访问到)

private:私有(类内可以访问但是类外不行)

protected:保护(类内可以访问类外不行)

(private与protected的区别是子类是否能继承父类)

struct是public而class默认是private。

所以也可以用struct来建类。


通常我们通过公开函数作为接口来改变我们保护或者隐私函数的值(也叫作封装),提高代码的安全性。

#include<iostream>
#include<string>
using namespace std;
class person{
   public:
       void input_weight();
       void input_name();
    private:
        double weight;
        string name;     
};
void person::input_weight(){
    int x;//临时存储
    cout<<"输入体重:  "<<endl;
    cin>>x;
    weight=x;

}
void person::input_name(){
    string x;//临时存储
    cout<<"输入名字:   "<<endl;
    cin>>x;
    name=x;
    
}

类内的函数可以在类外定义,不过要在类内声明该函数。

::是表面所属的类。在一个团队中难免会碰上变量名相同的情况,用::来表示是属于某个部分的内容。

2.对象的初始化和删除,以及拷贝

? ? ? ? ?构造函数和析构函数是负责对象初始化和释放前的清除。

? ? ? ? 只要创建对象就一定会存在析构函数,拷贝函数,构造函数.

? ? ? ? 构造函数(初始化函数)

class person(){
    person()//在()后面可以加上:来初始化对象属性
    {
        cout<<"初始化成功"<<endl;
    }    
};
/*person():weight(10),high(20)
    {
    }
10和20也可以用变量不过这样括号里面就要加上变量名称*/

? ? ? ? 这是类内声明的函数并且要保持公开才能用你写的构造函数否则是系统默认的空函数(只有空壳没有内容)

? ? ? ? 析构函数(释放对象前)

class person(){
    public:
    ~person(){
        cout<<"删除成功";
   }
}

? ? ? ? 析构函数中的括号不能带参数。构造函数是可以带参数的而且可以发生重载(如果构造函数带参数则创建的对象也要相应有参数)

(主函数)

运行结果图

现在让我们详细说说析构函数(拷贝构造函数)的使用。

一般来说有3中使用方法:

1.括号表示法:

person a;//不存在person a();编译器会默认为创造一个函数

person a(int b);//存在一个参数的时候.

//拷贝构造函数
person b(a);//括号内也为对象

2.显示法

person a;//和第一种一样

//带一个参数

person a=person(10)//拿10举个例子,但是这样会创造一个临时对象,临时对象在这行代码结束后就会消失,也会运行析构和构造函数

//拷贝函数

person b=person a;

3.隐式表示法

person a=10;//等价于person a=person(10)

//拷贝函数
person a=b;

接下来是拷贝构造函数

分为2大类:深拷贝和浅拷贝

浅拷贝:这是指直接的赋值,如果成员存在指针类型的拷贝后会指向同一个地方。

!!!!在程序中,由程序员控制的内存分配叫堆,在程序的后面要进行释放。所以在析构函数中一般会存在像这样的代码

? delete和free用法很像。但是浅拷贝会出现一个问题因为他是完全复制的所以在堆区同一个地址会被释放2次造成程序奔溃。而深拷贝解决了这样的问题。

深拷贝是在浅拷贝的基础上在堆区再申请一个区域,解决了二次释放的问题。

person(const person &a){
    weight=new int(*a.weight);
}

3.类的对象可以是其他类

? ? ? ? 这里记作为类的类为大类,作为对象的类为小类。

在用小类时与平常对象使用方法差不多,不过2个类的析构和构造顺序不一样,

小类先构造,大类先析构。


4.静态成员函数

? ? ? ? 以static开始的函数称为静态函数,在类中就称为静态成员函数,所有对象共用这个函数,所有静态成员函数只能调用静态成员变量。

!!!静态成员变量不算成员对象

5.this指针

? ? ? ? this是每个对象自带的指针,指向对象本身。在变量名特别多的时候很好用。

#include<iostream>
using namespace std;
class person {
	public:
		void glow(int age) {
			this->age=age;
		}
		void add(person &a){
			this->age+=a.age;
			
		}
		int age;
};
int main() {
	person I;
	I.glow(18);
	cout<<"我的年龄是: "<<I.age <<endl;
	
	person You;
	You.glow(10);
	cout<<"你的年龄是: "<<You.age<<endl;
	You.add(I);
	cout<<"你的年龄是: "<<You.age<<endl;
	
	
	
	
	return 0;
}
//结果是18,10,28。

不过通过this可以实现最有意思的就是无限累加

#include<iostream>
using namespace std;
class person {
	public:
		void glow(int age) {
			this->age=age;
		}
		person& add(person &a){
			this->age+=a.age;
			return *this;
		}
		int age;
};
int main() {
	person I;
	I.glow(18);
	cout<<"我的年龄是: "<<I.age <<endl;
	
	person You;
	You.glow(10);
	cout<<"你的年龄是: "<<You.age<<endl;
	You.add(I).add(I).add(I).add(I).add(I).add(I);
	cout<<"你的年龄是: "<<You.age<<endl;
	
	
	
	
	return 0;
}

通过对add的函数进行修改,*this指对象本身,使add函数返回的是一个对象就可以在下头进行累加。

6.常函数只能调用常对象,常对象也只能使用常函数。

? ? ? ? 用const修饰的对象和函数我们称之为常对象和常函数。如果想在常函数中使用非常变量就需要在声明变量前使用mutable这个关键词。

7.友元

? ? ? ? 友元和朋友的意思差不多给别人多一点的权限,就是称为友元的东西可以访问类内的私有属性的东西

#include<iostream>
using namespace std;
class xiaoming {
	public:
		xiaoming() {
			weight=80;
			high=180;
		}
		int high;
	private:
		int weight;
};
void ask() {
	xiaoming me;
	cout<<"小明身高是:  "<<me.high<<endl;
}
int main() {
	ask();
	return 0;
}

上面这段可以访问公共属性没什么问题?但是这时候如果想让ask这函数访问weight就不能实现了这时候就出现了友元的作用。

#include<iostream>
using namespace std;
class xiaoming {
	friend void ask();
	public:
		xiaoming() {
			weight=80;
			high=180;
		}
		int high;
	private:
		int weight;
};
void ask() {
	xiaoming me;
	cout<<"小明身高是:  "<<me.high<<endl;
	cout<<"小明体重是:  "<<me.weight<<endl;
}
int main() {
	ask();
	return 0;
}

?友元关键词是friend在类声明完后紧接着就是友元的声明。不仅全局函数可以作为友元,成员函数(其他类的函数),其他类都可以作为友元声明方式类似。


要是哪里有说错请指出!!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 10:38:58  更:2022-01-24 10:40:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:02:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码