c++–类和对象–对象特征

目录

1.对象的初始化和清理

2.构造函数和析构函数

3.构造函数的分类及调用

4.拷贝构造函数(复制构造函数)调用时机

5.析构函数的调用规则

6.深拷贝与浅拷贝

 7.初始化列表(构造函数)

8.类对象作为类成员

 9.静态成员

10.default和delete函数


 

1.对象的初始化和清理

2.构造函数和析构函数

一个对象或者变量没有初始状态,对其使用后果是未知的

同样的使用完一个对象或者变量,没有及时清理,也会造成一定的危害

如果我们不提供构造和析构函数,编辑器会提供,提供的构造和析构函数是空实现

  • 构造函数:用于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用
  • 析构函数:主要用于对象销毁前系统自动调用,执行清理工作

构造函数的语法:类名(){}

  1. 构造函数,没有返回值也不写void
  2. 函数名称与类名相同
  3. 构造函数可以有参数,因此可以发生重载
  4. 程序在调用对象时会自动调用构造函数,而且只会调用一次

析构函数的语法:~类名(){}

  1. 析构函数,没有返回值也不写void
  2. 函数名与类名相同,前加上~
  3. 析构函数不能有参数,因此不可以发生重载
  4. 程序在对象销毁前会自动调用析构函数,而且只会调用一次
#include
using namespace std;
class person{
public:
    person()//编写构造函数
    {
        cout<<"person构造函数的调用"<

3.构造函数的分类及调用

按参数分:有参构造和无参构造

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

三种调用方法:

括号法,显示法,隐式转化法

#include
using namespace std;
class person{
public:
    person()//无参构造
    {
        cout<<"person的无参构造函数"<

4.拷贝构造函数(复制构造函数)调用时机

  • 使用一个已经创建完毕的对象来初始化一个新对象
  • 值传递的方式给函数参数传值
  • 以值方式返回局部对象
#include
using namespace std;
class person{
public:
    person()
    {
        cout<<"person的无参构造函数"<

注意:在第二种调用方法中,如果形参为person &p,则为传引用,不会调用拷贝构造函数

在第三种调用方法中,如果函数类型为person &(也为引用型),则也不会调用拷贝构造函数

5.析构函数的调用规则

默认条件下,c++编译器会提供三个函数

  1. 默认构造函数(无参)
  2. 默认析构函数(无参)
  3. 默认拷贝函数,对属性进行值拷贝

构造函数调用该规则:

  • 如果用户定义有参构造函数,编译器不在提供默认的无参构造,但是会提供默认拷贝函数
  • 如果用户定义拷贝构造函数,编译器不会再提供其他构造函数
  • 如果我们自己写的有参的构造函数里面的形参初始化了,那么在创建无参的对象时可以不写无参的构造函数
#include
using namespace std;
class person{
public:
    person(){
        cout<<"person的默认构造函数调用"<

6.深拷贝与浅拷贝

浅拷贝:简单的赋值拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝工作

#include
using namespace std;
class person{
public:
     person(){
        cout<<"person的默认构造函数调用"<

浅拷贝带来的问题:堆区的数据重复被释放

c++–类和对象–对象特征_第1张图片

 7.初始化列表(构造函数)

语法:构造函数():属性1(值1),属性2(值2),属性3(值3){}

#include
using namespace std;
class person{
public:
    //传统初始化操作(编译器写的)
   // person(int a,int b, int c){
   //     m_a=a;
    //    m_b=b;
     //   m_c=c;
    //}
    person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
    }
    int m_a;
    int m_b;
    int m_c;
};
int main(){
    person p(10,20,30);
    cout<

8.类对象作为类成员

例如

class a{}
class b{
    a p;
}

b类中有a类对象p作为成员

当其他类对象作为本类成员时,构造的时候先构造其他类对象,再构造自身,析构相反

#include
using namespace std;
class phone{
public:
    phone(string name){    //构造函数
        m_phonename=name;
        cout<<"phone的构造"<

b667587234aa49b19d09edac960877a2.png

 大家可能会疑惑这里为什么将一个string类型的pname赋值给phone类的m_phone

其实本质是phone m_phone=pname,这就是我们上节的第三种初始化对象的方法:隐式转化法

 恭喜你看到了这里,给你点个赞

c++–类和对象–对象特征_第2张图片

 9.静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员变量

  • 所有对象共享同一份数据
  • 在编译阶段分配内存
  • 类内声明,类外初始化

静态成员函数

  • 所有对象共享同一个函数
  • 静态成员函数只能访问静态成员变量(静态成员函数内不含this指针)
  • 非静态成员函数可以访问静态成员变量和非静态成员变量

示例1:静态成员变量(不属于某个对象)

两种访问方式:1.通过对象进行访问

2.通过类名进行访问

(私有成员仍不可以被访问)

静态成员函数能通过对象进行访问,也能通过类名访问,但是非静态成员函数只能通过对象访问

 

#include
using namespace std;
class person{
public:
    static int m_a;

};
int person::m_a=100;  //类外初始化
int main(){
    person p;
    cout<

示例2:静态成员函数

#include
using namespace std;
class person{
public:
    static void func(){
        a=100;  //静态成员函数可以访问静态成员变量
        //b=1;    //静态成员函数不可以访问非静态成员变量
        cout<<"static void func调用"<

10.default和delete函数

一些情况下,用户只想简单的使用构造函数,不想花精力在复制控制优化性能上,因此提供了default和delete两个关键字来简化构造函数的定义与使用

使用=default可以要求编译器自动生成默认(无参构造函数)或复制构造函数

与default不同的是,delete不限于在无参和复制构造函数的使用上,除析构函数外,用户都可以指定为delete删除掉

例子如下:

class a{

public:

        a()=default;//默认合成的无参构造函数

        a(const a& m)=delete;//删除复制构造函数

 

 

 

 

 

 

 

 

你可能感兴趣的:(c++,开发语言)