【C++学习教程08】函数

参考

  • 范磊C++(第十课时)
  • VS2015

笔记

普通函数的重载

普通函数可以重载

成员函数的重载

成员函数也可以被重载

函数的缺省参数

  • 函数参数的初始化操作。叫默认参数又叫缺省(shen)参数。
  • 若在调用时没有传递值时,则会使用缺省值。
  • 成员函数也可以有缺省值。
  • 重载函数建议增加默认值?

重载构造函数

  • 构造函数可以重载但是只能执行一个

成员变量的初始化

  • 构造函数体中进行初始化;
  • 在构造函数的函数头进行初始化;
    在这里插入图片描述
    在这里插入图片描述

成员变量的初始化与构造函数

  • 构造成员和析构成员的顺序(第二节课件损坏)
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	A(int a, int b) { num = a; total = b; }//但是常量和引用不能被赋值!!
private:
	int num;
	int total;
};

int main(int argc, const char * argv[]) {

	return 0;
}

构造函数和NEW运算符

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	A() { cout << "构造函数执行完毕" << endl; }
	void set(int a, int b)
	{
		i = a;
		j = b;
	}
	void print() { cout << i << endl; cout << j << endl; }
private:
	int i;
	char j;
};

int main(int argc, const char * argv[]) {
	A *a = new A;//在堆中创建对象
	a->set(3, 5);//指针要用成员指针运算符 //ascii码5对应的字符
	a->print();
	system("pause");
	return 0;
}

再谈默认的构造函数

  • 当不定义构造函数时,C++将默认定义一个不带参数的构造函数。
  • 当你创造构造函数之后,编译器就不会再提供默认构造函数。
  • 不加访问修饰符的会默认为私有的。

复制构造函数

  • 复制构造函数可以复制一个对象
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	A() { cout << "构造函数执行完毕" << endl; }
	A(A& one) { this->n = one.n; m = one.m; }
	//复制构造函数,参数为类A对象的一个引用,可以通过参数来接受A的参数,one就是一个别名
	//每一个类都有,不定义编译器会自动定义,实现成员的对拷贝
	A(int i, int j) { n = i; m = j; }//带参数的构造函数
	void print()
	{
		cout << n << m;
	}
private:
	int n;
	int m;
};

int main(int argc, const char * argv[]) {
	A a(2, 4);
	a.print();
	cout << "
" << endl;
	A b(a);//传递对象会调用复制构造函数 //将成员进行拷贝
	b.print();
	system("pause");
	return 0;
}

析构函数和delete运算符

  • 析构函数和delete的搭配使用
  • delete会自动调用析构函数来释放new运算符所创建的内存空间。

默认析构函数

-不定义的话,编译器会默认定义析构函数。

调用构造函数进行类型转换

在这里插入图片描述

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	explicit A(int x) { i = x; cout << "构造函数执行完毕" << i<<endl; }//关闭这种特性,来制止隐式转化
	~A(){ cout << "析构函数在执行" <<i<< endl; }
	void get() { cout << i << endl; }
private:
	int i;
};

int main(int argc, const char * argv[]) {
	A a(99);
	a.get();
	//a = 1000;//隐式转化
	a = A(1000);//数值赋给对象 //类型转换 //这是在调用构造函数 //相当于创建了临时对象
				//参数个数和构造函数的个数一样
	//但是这样会导致一些意外,所以应该关闭这种特性,但是显示转换是可以的。
	//调用构造函数创建临时对象,将临时对象的成员i赋值给a的成员i,创建了临时对象,所以会调用析构函数。
	a.get();
	system("pause");
	return 0;
}

输出结果:
在这里插入图片描述

浅层复制构造函数

在这里插入图片描述
在这里插入图片描述如果发生了delete操作,则会触发程序崩溃。

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	A() { x = new int; *x = 5; }
	~A() { delete x; x = NULL; }//C++区分大小写
	A(const A&a) { cout << "复制构造函数执行" << endl;
	x = a.x;
	}
	void print() { cout << *x << endl; }
	void set(int i) { *x = i; }
private:
	int *x;
};

int main(int argc, const char * argv[]) {
	A *a = new A();
	cout << "a:";
	a->print();
	A b = (*a);//将一个对象复制给另一个对象,这时候会调用复制构造函数
	b.print();
	a->set(32);//a和b的x指向同一块内存
	cout << "a:";
	a->print();
	cout << "b:";
	b.print();
	//delete a;//此时会报错,
	system("pause");
	return 0;
}

输出结果:
在这里插入图片描述
第二课时失效

深层复制构造函数

在这里插入图片描述

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
	A() { x = new int; *x = 5; }
	~A() { delete x; x = NULL; }
	//深层复制构造函数
	A(const A&a) 
	{ 
		cout << "复制构造函数执行" << endl;
		x=new int;//用复制构造函数创建的新对象的指针成员x来指向它。//两个对象的x指针指向不同的内存
		*x = *(a.x);//不再复制指针而是复制指针的值
	}
	void print() const { cout << *x << endl; }
	void set(int i) { *x = i; }
private:
	int *x;
};

int main(int argc, const char * argv[]) {
	A *a = new A();
	cout << "a:";
	a->print();
	A b = (*a);//将一个对象复制给另一个对象,这时候会调用复制构造函数
	b.print();
	a->set(32);
	cout << "a:";
	a->print();
	cout << "b:";
	b.print();
	delete a;
	//a->print();
	b.print();
	system("pause");
	return 0;
}

在这里插入图片描述
输出结果:
在这里插入图片描述

原文地址:https://www.cnblogs.com/vrijheid/p/14222999.html