欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++构造函数的三种调用方法

程序员文章站 2022-04-27 20:24:30
...

C++构造函数的三种调用方法

1、拷贝参数传递,

void test01() {
	Point p = Point(2, 3);
	cout << "p.x=" << p.x << endl;
	cout << "p.y=" << p.y << endl;
	cout << "p.地址:" << (int*)&p << endl;
	Point p1 = Point(p);
	cout << "p1.x=" << p.x << endl;
	cout << "p1.y=" << p.y << endl;
	cout << "p1.地址:" << (int*)&p1 << endl;
}
构造函数
p.x=2
p.y=3
p.地址:012FFADC
拷贝函数:
p1.x=2
p1.y=3
p1.地址:012FFAC0
析构函数!!!!
析构函数!!!!

2、作为函数的参数传入。

void f(Point p) {
	//不加指针不加引用时,为了不改变原来的对象的属性,会复制一个新的对象。
	//新对象生成时会自动调用构造函数。
	cout << "p.x=" << p.x << endl;
	cout << "p.y=" << p.y << endl;
	cout << "p.地址:" << (int*)&p << endl;
}
void test02() {
	Point p1(8,9);
	cout << "p1.x=" << p1.x << endl;
	cout << "p1.y=" << p1.y << endl;
	cout << "p1.地址:" << (int*)&p1 << endl;
	f(p1);
}

构造函数
p1.x=8
p1.y=9
p1.地址:008FFA88
拷贝函数:
p.x=8
p.y=9
p.地址:008FF994
析构函数!!!!
析构函数!!!!

3、作为函数的返回值传出

Point g() { //一个返回Point对象的函数。
	Point p(3, 4);
	cout << "p.x=" << p.x << endl;
	cout << "p.y=" << p.y << endl;
	cout << "p.地址:" << (int*)&p << endl;
	return p;
	//返回值时复制一个新的对象,函数结束,上一个对象被删除
}
void test03() {
	Point p1(g());
	cout << "p1.x=" << p1.x << endl;
	cout << "p1.y=" << p1.y << endl;
	cout << "p1.地址:" << (int*)&p1 << endl;
}
构造函数
p.x=3
p.y=4
p.地址:00FDF854
拷贝函数:
析构函数!!!!
p1.x=3
p1.y=4
p1.地址:00FDF95C
析构函数!!!!

Point类

#pragma once
#include<iostream>
using namespace std;

class Point {
public:
	int x;
	int y;
	Point();
	Point(int x, int y);
	Point(const Point &t);
	~Point();
};

//函数实现
Point::Point() {//默认构造函数
	x = 0;
	y = 0;
}
//带参的构造函数
Point::Point(int x, int y):x(x),y(y) {
	cout << "构造函数" << endl;
}
//拷贝构造函数
Point::Point(const Point& t):x(t.x),y(t.y),p(new int(*(t.p))) {
	cout << "拷贝函数:" << endl;
}
//析构函数
Point::~Point() {
	if (p!=NULL)
	{
		delete(this->p);//调用拷贝结束时候会重复删除,所以要在拷贝时,重新分配创建一个新的空间
	}
	cout << "析构函数!!!!" << endl;
}