目录
参考
- 范磊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;
}
输出结果: