首页 > 编程语言 >C++——构造函数的使用注意事项及static用法

C++——构造函数的使用注意事项及static用法

时间:2022-12-27 10:35:07浏览次数:44  
标签:初始化 int C++ a1 a2 static year date 构造函数

1.构造函数

1.构造函数赋值和初始化列表

#include<iostream>
using namespace std;
class date
{
public:
date(int year = 1, int month = 1, int day = 1)
{
//函数体赋值
_year = year;
_month = month;
_day = day;
}
date(int year = 1, int month = 1, int day = 1)
:_year(year), _month(month), _day(day)
{
//初始化列表
}
private:
int _year;
int _month;
int _day;

};
int main()
{
return 0;
}


为什么要有初始化列表存在呢?

​引用类成员

const类成员变量

自定义类型成员函数(该类没有默认成员函数)

必须放在初始化列表位置初始化

#include<iostream>
using namespace std;
class A
{
A(int a)
:_a(a)
{

}
private:
int _a;
};
class B
{
public:
B(int a, int ret)
:_aobj(a)
,_ret(ret)
,_n(10)
{
//初始化列表
}
private:
int& _ret;//引用
const int _n;//const
A _aobj;//没有默认构造函数

};
int main()
{
return 0;
}


引用、const修饰的必须在定义的时候初始化

而自定义类型 没有默认构造函数即不用传参就可以调用的函数 (没有给它赋值)

也就需要定义的时候初始化

C++——构造函数的使用注意事项及static用法_临时对象

例题

#include<iostream>
using namespace std;
class A
{
public:
A(int a)
:_a1(a)
,_a2(_a1)
{

}
void print()
{
cout << _a1 << " " << _a2 << endl;
}
private:
int _a2;
int _a1;
};
int main()
{
A aa(1);
aa.print();
return 0;
}

正常来说,结果应为 1 1,但是为什么变成 1 随机值?

​成员变量在类中声明次序就是初始化列表的初始化顺序,与其初始化列表中的先后次序无关

_a2声明在前面

所以先初始化 _a2,先进行 _a2(_a1),而此时的_a1为随机值,所以_a2为随机值

然后才进行 _a1(a),_a1赋值成1

最终结果 为 1 随机值

隐式类型转换

#include<iostream>
using namespace std;
class date
{
public:
date(int year)
:_year(year)
{

}
private:
int _year;
};
int main()
{
date d1(1);//构造
date d2 = 2;// 用2构造了一个临时对象,将用临时对象拷贝构造d2
date d3(d1);//拷贝构造
return 0;
}

date d2=2,相当于 date tmp(2),使用2构造一个临时对象tmp,

d2(tmp),再使用 tmp拷贝构造d2

当我们改成引用后,发现不可以实现

C++——构造函数的使用注意事项及static用法_拷贝构造_02

其中包含临时对象tmp,临时对象具有常性,要加 const修饰

C++——构造函数的使用注意事项及static用法_临时对象_03

explicit的使用

#include<iostream>
using namespace std;
class date
{
public:
explicit date(int year)
:_year(year)
{

}
private:
int _year;
};
int main()
{
date d1(1);//构造
date d2 = 2;// 用2构造了一个临时对象,将用临时对象拷贝构造d2
date d3(d1);//拷贝构造
return 0;
}

若不想要隐式类型转换发生,加入关键字 explicit

static用法

例题

设计一个类A,可以计算这个类总计产生了多少对象?

自定义一定要调用 构造函数 或者 拷贝构造

方法1

设计一个全局变量n 用于统计

#include<iostream>
using namespace std;
int n = 0;//设计一个全局变量用于统计
class A
{
public:
A()//构造
{
++n;
}
A(const A& d)//拷贝构造
{
++n;
}
};
A f1(A a)
{
return a;
}
int main()
{
A a1;
A a2;
f1(a1);
f1(a2);
cout << n << endl;//6
return 0;
}

​说明一共产生了6个对象

A a1 ,A a2 ,共产生 2个对象

f1(a1)时,将a1传值给 a ,属于值传递,发生了拷贝调用

由于 f1 函数 是 值返回 ,所以 会再次发生 拷贝调用,生成一个临时对象

所以 f1(a1)共产生 2个对象

同理 , f1(a2)也产生 2个对象

共有 产生6个对象

方法2

为了防止n能随意修改

使用static修饰

#include<iostream>
using namespace std;
class A
{
public:
A()//构造
{
++n;
}
A(const A& d)//拷贝构造
{
++n;
}
static int getN()//使用static修饰后,没有默认this指针,函数中也不能访问非静态成员
{
return n;
}
private:
static int n;//声明,属于类的所有对象,存于静态区
};
int A::n = 0;//定义
A f1(A a)
{
return a;
}
int main()
{
A a1;
A a2;
f1(a1);
f1(a2);
cout << A::getN() << endl;//6
return 0;
}

使用static,将n放在静态区中,属于类中的所有对象

C++——构造函数的使用注意事项及static用法_临时对象_04


标签:初始化,int,C++,a1,a2,static,year,date,构造函数
From: https://blog.51cto.com/u_15787387/5971486

相关文章

  • C++基础
    输出语句#include<iostream>intmain(){std::cout<<"HelloWorld!\n";//输出HelloWorldstd::cout<<std::endl;//输出换行}如果要使用cout输出变量......
  • 「REMAKE C++」Day 4
    Day4内联函数和constexpr函数声明和定义都在头文件中封装的益处:确保用户代码不会无意间破坏封装对象的状态。被封装的类的具体实现细节可以随时改变,而不必调整......
  • 关于c++中读入输出方式的重定向
    今天氵数据结构实验的时候发现了关于cpp文件和控制台输入输出重定向的问题。题目要求先从文件读入,然后再从控制台读入,再从控制台输出,最后输出到文件。本来想的是用freope......
  • macOS下vscode配置c++万能头文件
    vscode正常情况下是不能使用c++的万能头文件#include<bits/stdc++.h>,那么这会给我们算法刷题带来一定的不便,以下是配置教程,具体可以参考该博文:macOS下使用bits/stdc++.h万......
  • 基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)
    C++是一种编译型(compiled)语言,设计重点是性能、效率和使用灵活性,偏向于系统编程、嵌入式、资源受限的软件和系统。Python是一种解释型(interpreted)语言,同样也支持不同的......
  • C++实现Socket连接通信
    一、打开两个VS2019,创建两个控制台程序分别命名为client和servers 二、编写服务端servers1、包含头文件及库文件#include<WinSock2.h>#pragmacomment(lib,"ws2_32.lib")#......
  • c/c++非阻塞键盘输入监听 Windows/Linux
    https://blog.csdn.net/a8821418/article/details/106492074Windows下c代码#include<conio.h>#include<windows.h>#include<iostream>usingnamespacestd;i......
  • 【C++入门】(五)字符串
    一. 字符与整数的联系——ASCII码每个常用字符都对应一个-128~127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符常用ASCII值:'A'-'Z'是65~90......
  • 面向对象-static关键字
    概述static是静态修饰符,在程序中任何变量或则代码都是在编译时由系统自动分配内存进行存储,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个......
  • 【C++】虚函数与多态
    所谓多态,简单来讲就是指,不同的子类在继承父类后分别都重写覆盖了父类的方法。例如下例中:classA{public:voidf(){cout<<"这是A中的func"<<end......