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;
}