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++知识库]C++ 特性 -封装

1.1类和对象

封装属性和行为作为整体

class typename{
      admission://public,protected,private;
      属性:
      .......
      行为函数:
      ......
};
int main(){
     typename  ....  //实例化instantiate

}

1.2封装-权限:

公共权限: public:成员类内可以访问,类外也可以访问

保护权限: protected:成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护权限内容。

私有权限 : private:成员雷内可以访问,类外不可以访问,儿子不可以访问父亲中的私有权限内容。C++类内不声明,默认权限是私有

#include<bits/stdc++.h>
using namespace std;
#define PI 3.14
class Person{
	public:
	string name;	
    protected :
	string car;			
	private: 
	int password;	
	public:
	void init(){
	name="ULL_64";
	car="bigG";
    password=124324;	
	} 	  
};
signed main(){
    Person p1;
    p1.init();
    cout<<p1.name<<endl;
  //cout<<p1.car<<endl;//protected  error
   //cout<<p1.password<<endl;//protected error
	return 0;
}

1.3利用public接口实现对私有权限内容得读写操作:

成员函数设置为私有的优点

1>可以自行控制读写权限;

2>对于写可以检测数据的有效性。

#include<bits/stdc++.h>
using namespace std;
#define PI 3.14
class Person{
public :
	setname(string s){
		name=s;
	}
	string getname(){
		return name;
	}
	int getage(){
		return age;
	}
    string getlover(){
		return lover;
	}
	void setage(int x){
        if(x<0||x>150)
       {
          cout<<"你这个老妖精!"<<endl;
          return ;
        }
		age=x;
	}
	void setlover(string s){
	    lover=s;
	}
private:
    string name;
    int age;
    string lover;
    
};
signed main(){
    Person p1;
    p1.setname("EX艾雷王!");
    p1.setage(1000);
    p1.setlover("EX雷德王!");
    cout<<p1.getname()<<endl;
    cout<<p1.getage()<<endl;
    cout<<p1.getlover()<<endl;
	return 0;
} 

1.4对象的初始化与清理:

构造函数与析构函数

构造函数的作用:初始化;

1.没有返回值不用写void

2.函数名与类名相同

3.构造函数可以有函数,可以发生重载

4.创建对象时,构造函数会自动调用一次。

析构函数:主要作用于对象被销毁前系统自动调用,执行一些清理工作。

1.没有返回值,不写void

2.函数名和类名相同,名称前加上~

3.析构函数不含参数,不可以发生重载

4.对象销毁前自动调用一次。

#include<bits/stdc++.h>
using namespace std;
class Person{
	public: 
	 Person(){
	 	cout<<"构造函数的调用 "<<endl;
	 }
	 ~Person(){
	 	cout<<"析构函数的调用"<<endl;
	 }
};
void test01(){
	Person p;
}
signed main(){
    Person p;
    test01();
    system("pause");return 0;
} 

1.4.1构造函数的分类及其调用:

按参数:含参构造,无参构造。无参构造函数不要写括号,会被编译器认定为非类的函数。

拷贝构造函数和普通构造。

注意:匿名对象的特点,当前执行结束后就被系统释放

括号法构造

? ?Person p1;
? ?Person p2(10);
? ?Person p3(p2);

显示法构造:

Person p1

Person p2=Person(10)

Person p3=Person(p2);

注意:不要用拷贝函数初始化匿名对象。

隐式转化法

Person p1=10;

Person p2=p1;

拷贝构造的调用时机:

+? ?使用一个已经创建完毕的对象来初始化一个新对象

+? 值传递的方式给函数参数传值

+? 以值的方式返回局部变量

构造函数调用规则:

1.1 编译器的默认构造函数

1.默认构造函数(无参空函数体)

2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数(对属性进行值拷贝)

1.2 注意事项

1.如果创建了有参构造函数,编译器就不再提供默认无参构造函数。

2.如果创建了拷贝构造函数,编译器就不再提供任何默认构造函数。

1.4.2 深拷贝与浅拷贝:

浅拷贝:简单的赋值拷贝参数,编译器进行逐个字节拷贝的是浅拷贝。

浅拷贝带来的问题是堆区的内存被重复释放

解决办法,重新写一个拷贝构造函数。

#include<bits/stdc++.h>
using namespace std;
class Person{
	public :
	int age;
	int *height;
	Person(){
		cout<<"默认构造函数"<<endl;
	}
	Person(int x,int Height){
		age=x;
		height=new int (Height);
		cout<<"有参构造函数"<<endl;
	}
	~Person(){
		if(height!=NULL){
			delete height;
			height=NULL;
		}
		cout<<"析构函数"<<endl;
	}
	Person(const Person &p){
	   cout<<"copy"<<endl;
	   age=p.age;
	   height=new int (*p.height);
	}
   	
};
void test01(){
	Person p1(10,135);
	Person p2(p1);
	cout<<p1.age<<" "<<p2.age<<endl;
	cout<<*p1.height<<" "<<*p2.height<<endl;
}
signed main(){
   	test01();

	return 0;
}

如果属性有在堆区开辟的,一定要自己实现一个拷贝构造函数。避免程序崩溃。

深拷贝:在堆去申请空间,进行拷贝操作

1.5 初始化列表:

语法:构造函数()属性1(val1) 属性2(val2).......{}

? ? ? ? 类内定义Person(int a,int b,int c) : m_a(a),m_b(b),m_c(c){}?? ?
? ? ? ? 类外调用Person p(30,20,10);

1.6类对象作为类成员

C++中类的成员可以是另一个类的对象,我们称该成员为类对象。

当其他的类的对象作为本类成员,先构造其他类的对象在构造本类成员。

析构是结论相反。

#include<bits/stdc++.h>
using namespace std;

class Phone{
	public:
		string phonename;
		Phone(string name){
			cout<<"Phone 的构造函数"<<endl;
			phonename=name;
		}
};
class Person{
	public:
		string name;
		Phone phone;
    Person (string Name,string Phonename):name(Name),phone(Phonename){
		cout<<"Person 的构造函数"<<endl;
	   }	
};
void test01(){
   Person p("张三","iphone");
   cout<<p.name<<" take an"<<p.phone.phonename<<endl; 
}
signed main(){
   	test01();
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:00:50 
 
开发: 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年5日历 -2024/5/21 1:25:36-

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