当前位置: 首页 > news >正文

C++:类和对象(2)

目录

1.strcut和class的区别

2.将成员属性设置为私有

3.对象的初始化和清理

3.1 构造函数和析构函数

3.1.1 构造函数语法

3.1.2 析构函数语法

3.1.3 检验

3.2 构造函数的分类和调用

3.3 拷贝构造函数调用


1.strcut和class的区别

     struct和class的唯一区别在于默认的访问权限不同

     struct默认权限是公共 public

     class默认权限是私有 private

struct C1
{int a;
};
class  C2
{int a;
};
struct C1 c1;
c1.a=100;//在struct默认权限为公共,因此可以访问
C2 c2;
c2.a=100;//在class默认权限为私有,因此不能访问

2.将成员属性设置为私有

     优点1:将所有成员属性设置为私有,可以自己控制读写权限

     优点2:对于写权限,我们可以检测数据的有效性

#include<iostream>
using namespace std;
class Person
{//姓名设置可读可写void setName(string name){_name=name;}void getName(){return _name;}//年龄设置只读 int getAge(){return _age;}//偶像设置只写 外界无法访问void setIdol(string idol){_idol=idol;}
private:string _name;//可读可写int _age=18;//只读string _idol;//只写
};

3.对象的初始化和清理

     在生活中我们购买电子产品都会有出厂设置,我们如果不用了也要删除信息保证自己的隐私安全,C++的面向对象来源于生活,每个对象也会有初始化设置以及对象销毁前的清理数据的设置。

3.1 构造函数和析构函数

     一个对象或者变量没有初始状态,使用后果很未知,用完不进行清理。也有安全问题。C++利用构造函数析构函数解决问题,这两个函数被编译器自动调用,完成对象的初始化和清理工作。

如果我们自己不实现这两个操作,编译器会提供,但编译器提供的构造函数和析构函数是空实现

     构造函数:主要用于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用,当然也可以自己进行实现。

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

3.1.1 构造函数语法
类名(){}
1.构造函数没有返回值,不用写void2.函数名称与类名相同3.构造函数可以有参数,因此可能有重载4.程序在调用对象时会自动调用该函数,且只调用一次
3.1.2 析构函数语法
~类名(){}
1.构造函数没有返回值,不用写void2.函数名称与类名相同,在名称前加上~3.构造函数不可以有参数,因此不可能有重载4.程序在对象销毁前会自动调用该函数,且只调用一次
3.1.3 检验
#include<iostream>
using namespace std;
class Person
{
public://构造函数Person(){cout<<"Person 构造函数的调用"<<endl;}//析构函数~Person(){cout<<"Person 析构函数的调用"<<endl;}
}
int main()
{Person p;//在栈上的数据,之后释放该对象
}

     输出:

Person 构造函数的调用
Person 析构函数的调用

     可以发现,我们只是创建了一个对象,并没有实现函数,这肯定是构造函数和析构函数被系统自动调用了啊,这两个函数都是必须有的,如果我们自己不提供,编译器给你提供,但都是空实现。

3.2 构造函数的分类和调用

     分类

           按参数分为:含参构造和无参构造 无参构造又称为默认构造函数

           按类型分为:普通构造和拷贝构造

     调用

            括号法

            显示法

            隐式转换法

#include<iostream>
using namespace std;
class Person
{
public://构造函数 普通构造Person(){cout<<"Person 无参(默认)构造函数的调用"<<endl;}Person(int a){cout<<"Person 含参构造函数的调用"<<endl;}//拷贝构造函数Person(const Person &p){cout<<"拷贝构造函数的调用"<<endl;age=p.age//将传入对象上的所有属性,拷贝到另一个人身上}//析构函数~Person(){cout<<"析构函数的调用"<<endl;}
}  //调用
void test()
{//括号法Person p1;//默认构造函数的调用Person p2(10);//含参构造函数的调用Person p3(p2);//拷贝构造函数的调用//显示法Person p1;Person p2=Person(10);//Person(10)为匿名对象 特点:当前行命令执行结束后,系统会马上回收匿名对象Person p3=Person(p2);//不能利用拷贝构造函数来初始化匿名对象,编译器会认为Person(p3)===Person p3;导致重定义//隐式转换法Person p4=10;//相当于Person p4=Person(10);Person p5=p4;}
int main()
{test();
}

3.3 拷贝构造函数调用

     C++拷贝构造函数通常是这三种情况:

1.使用一个已经创建完的对象来初始化一个新对象
2.值传递的方式给函数参数传值
3.以值方式返回局部对象

     以上面的class为例

1.使用一个已经创建完的对象来初始化一个新对象

Person p1;
Person p2(p1);

 2.值传递的方式给函数参数传值

void doWork(Person p)
{}
void test()
{Person p;//调用默认构造函数doWork(p);//值传递 实参传给形参,调用拷贝构造函数
}

3.以值方式返回局部对象

Person doWork()//根据p1 创建出一个新对象返回 这肯定要调用拷贝构造函数
{Person p1; return p1;
}
void test()
{Person p=doWork();
}
http://www.lryc.cn/news/273620.html

相关文章:

  • 【React系列】网络框架axios库的使用
  • pygame学习(二)——绘制线条、圆、矩形等图案
  • TCL学习笔记(持续更新)
  • Xpath的问题:为什么在DOM中确定存在(可见)的元素,用//表达式匹配不到(附解决办法)
  • 有没有游泳可以戴的耳机?游泳耳机入耳式好,还是骨传导好
  • 【绘图软件】自用安装教程
  • AIGC时代-GPT-4和DALL·E 3的结合
  • springBoot集成RabbitMQ实现(直连模式\路由模式\广播模式\主题模式)的消息发送和接收
  • Attention机制
  • Rust 常用的第三方库
  • 构建高可用性Java应用:介绍分布式系统设计与开发
  • x-cmd pkg | gitui - git 终端交互式命令行工具
  • javaWeb案例知识点
  • SQL日期列更新操作详解
  • stable diffusion 基础教程-图生图
  • 如何获取高质量的静态住宅代理?常见问题与误区
  • 基于SpringBoot的旅游网站281
  • 做外贸没客户就静下来沉淀
  • 网络流总结
  • 安卓11通过脚本修改相应板型系统属性
  • 网络安全—PKI公钥基础设施
  • 推荐一款加速器,也可加速github
  • springboot框架,中间库是mognodb,可以写入2个数据库的Demo
  • 基于Java SSM框架实现旅游资源网站系统项目【项目源码+论文说明】
  • 015、控制流运算符match
  • 个人博客主题 vuepress-hope
  • 【LeetCode-剑指offer】--19.验证回文串II
  • 锂电池寿命预测 | Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测
  • JSON 详解
  • 我不想学JAVA---------JAVA和C的区别