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

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

  • 相关阅读:
    java中i++ 和 ++i的区别
    下载及配置Python+openCV
    Java 计算两个日期相差多少年月日
    conda创建、查看、删除虚拟环境
    MySQL Explain详解
    mysql实现group by后取各分组的最新一条
    Mybatis中的映射结果resutType和resultMap
    java8 Stream 快速实现List转map 、分组、过滤等操作
    LC1263-AI寻路优化: 距离优先bfs -> heuristic + A* -> tarjan + A*
    第8章复习
  • 原文地址:https://www.cnblogs.com/vrijheid/p/14222999.html
Copyright © 2020-2023  润新知