/*
//1 函数的重载 普通函数的重载
#include <iostream>
using namespace std;
void func(int);
void func(long);
void func(float);
void func(double);
int main()
{
int a = 1;
long b = 100000;
float c = 2.1;
double d = 2.1415926;
func(a);
func(b);
func(c);
func(d);
return 0;
}
void func(int a){
cout<<"int: a="<<a<<endl;
}
void func(long a){
cout<<"long: a="<<a<<endl;
}
void func(float a){
cout<<"float: a="<<a<<endl;
}
void func(double a){
cout<<"double: a="<<a<<endl;
}
*/
/*
//2 函数的缺省参数
#include <iostream>
using namespace std;
//void func(int a=0, int b=0)
//{
// cout<<"a:"<<a<<endl;
// cout<<"b:"<<b<<endl;
//};
class A{
public:
void set(int = 30, int = 5);
void count(bool = false);
private:
int w;
int h;
};
void A::set(int width, int height)
{
w = width;
h = height;
}
void A::count(bool val)
{
if(val == true){
cout<<"val的值为真时:"<<w*h<<endl;
}else{
cout<<"val的值为假时:"<<w*h/2;
}
}
int main()
{
//func();
A a;
a.set();
a.count();
return 0;
}
*/
/*
//重载构造函数
#include <iostream>
using namespace std;
class rectangle
{
public:
rectangle(){cout<<"构造一个长方形"<<endl;}
rectangle(int l, int w){ lenght = l, width=w; cout<<"长方形的b的面积为:"<<lenght*width<<endl;}
rectangle(int l, int w, int h){lenght=l, width=w, height=h; cout<<"长方体体职为:"<<lenght*width*height<<endl;}
int area(){
cout<<"length:"<<lenght<<endl;
cout<<"width:"<<width<<endl;
return lenght * width;
}
private:
int lenght;
int width;
int height;
};
int main()
{
rectangle a;
rectangle b(11,22);
rectangle c(11,22,33);
//cout<<"a的面积为:"<<a.area()<<endl;
//cout<<"b的面积为:"<<b.area()<<endl;
//cout<<"c的面积为:"<<c.area()<<endl;
return 0;
}
*/
/*
// 4 成员变量的初始化
#include <iostream>
using namespace std;
class rectangle
{
public:
//rectangle(){cout<<"构造一个长方形"<<endl;}
//rectangle(int l, int w){ lenght = l, width=w; cout<<"长方形的b的面积为:"<<lenght*width<<endl;}
//rectangle(int l, int w, int h){lenght=l, width=w, height=h; cout<<"长方体体职为:"<<lenght*width*height<<endl;}
//而在文件头是为函数参数进行初始化
rectangle():lenght(1),width(2){ cout<<"长方形的面积为:"<<lenght*width;}
//rectangle(){ lenght=3, width=4;} //这种方法是为成员函数进行赋值
int area(){
cout<<"length:"<<lenght<<endl;
cout<<"width:"<<width<<endl;
return lenght * width;
}
private:
//int lenght;
const int lenght;
int width;
int height;
};
int main()
{
rectangle a;
//rectangle b(11,22);
//rectangle c(11,22,33);
//cout<<"a的面积为:"<<a.area()<<endl;
//cout<<"b的面积为:"<<b.area()<<endl;
//cout<<"c的面积为:"<<c.area()<<endl;
return 0;
}*/
/*
// 5 成员变量的初始化与构造函数
#include <iostream>
using namespace std;
class demo
{
public:
demo(){cout<<"demo构造函数"<<endl;}
demo(int i){ x = i; cout<<"demo构造带一个参数"<<endl;}
int get(){ return x;}
private:
int x;
};
class rectangle
{
public:
rectangle():x(100){ cout<<"rectangle构造函数"<<x<<endl;}
rectangle(int _x, int w, int h):x(_x),width(w),height(h)
{
cout<<"rectangle带三个参数构造函数:面符号为:"<<width.get()*height.get()<<endl;
}
~rectangle(){ cout<<"析构函数"<<endl;}
int area(){ return height.get()*width.get();}
private:
int x;
demo width;
demo height;
};
int main()
{
rectangle(100,200,300);
return 0;
}
#include <iostream>
using namespace std;
class A
{
public:
//A(int a, int b)
//{
//number = a;
//total = b;
//}
//这里就需要在头来实现参数的初始化
A(int a, int b):number(a),total(b)
{
}
void set(int i, int y=11, int x=11){
cout<<"i:"<<i<<", y:"<<y<<", x:"<<x<<endl;
}
private:
//int number;
//int total;
//如果number是一个const,total是一个引用,那么上面的赋值构造函数就不行
const int number;
int &total;
};
int main()
{
A a(22,33);
a.set(22);
return 0;
}
*/
/*
// 复制构造函数
#include <iostream>
using namespace std;
class A
{
public:
A(){}
A(A &a){ this->n=a.n; this->m = a.m;}
A(int i, int j){ n=i, m=j;}
void print()
{
cout<<"m:"<<m<<",n:"<<n<<endl;
}
private:
int n;
int m;
};
int main()
{
A a(2,4);
a.print();
A b = a;
b.print();
return 0;
}
*/
/*
// 7 构造函数和NEW运算符
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout<<"构造函数执行"<<endl;}
void set(int a, int b)
{
i = a;
j = b;
}
void parint()
{
cout<<"i:"<<i<<", j:"<<j<<endl;
}
private:
int i;
int j;
};
int main()
{
//A a;
//a.set(2,3);
A *a = new A();
a->set(2,3);
a->parint();
return 0;
}
*/
/*
// 8 再谈默认构造函数
#include <iostream>
using namespace std;
class A
{
public:
A(){}
A(int i){ x=i;}
private:
int x;
};
int main()
{
A a;
A b(2);
return 0;
}
// 每个对像在创建时都要调用构造函数来为自已初始化,假如你没提供一个构造函数,那么编译器就会自动创建立一个默认的构造函数
//假如你创建一个构造函数,不管你创建的是默认构造函数还是带参数的构造函数
//编译器都不再为你提供任何默认构造函数,假如你还想要一个带参数的构造函数,那么你就必须自已再创建一个
*/
/*
// 9 析构函数和delete运算符
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout<<"构造函数执行"<<endl;}
~A(){ cout<<"析构函数执行"<<endl;}
};
int main()
{
A *p = new A();
delete p;
return 0;
}
*/
/*
// 10 默认析构函数
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout<<"构造函数执行"<<endl;}
//~A(){ cout<<"析构函数执行"<<endl;}
//这里将调用默认的析构函数
};
int main()
{
A *p = new A();
delete p;
return 0;
}
*/
/*
// 11 调用构造函数进行类型转换
#include <iostream>
using namespace std;
class A
{
public:
//explicit关键字关闭隐式转换
//这里将不能进行隐式转换
explicit A(int x){ i = x; cout<<"构造函数执行"<<i<<endl;}
~A(){ cout<<"析构造函数执行"<<i<<endl;}
void get(){ cout<<i<<endl;}
private:
int i;
};
int main()
{
A a(199);
a.get();
//隐式转换
//a = 1000; //类型转换,相当于 a = A(1000);
//显示转换
a = A(1000); //转换类型, 将1000强制转换为a 中的i参数
return 0;
}
*/
/*
//12 浅层复制构造函数
#include <iostream>
using namespace std;
class A
{
public:
A(){ x = new int; *x = 5;}
~A(){ delete x; x = NULL; cout<<"析构函数执行";}
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()
{
A *a = new A();
cout<<"a:";
a->print();
cout<<"a的地址是:"<<a<<endl;
A b = (*a); //复制函数
b.print(); // 5
cout<<"b的地址是:"<<&b<<endl;
a->set(33);
cout<<"b:";
b.print(); //33,这里的复制,但是对像类的参数地址都是在一个地方
cout<<endl;
//delete a; //浅层复制会有秘途指针的问题,但这里还是没有了解秘途指针是在那一步出现的
//这里的复制
return 0;
}
*/
//13 深层复制构造函数
//为了解决浅层复制导致的迷途指针问题,我们必须创建自己的复制构造函数
//并且在函数里为我们的成员变量分配内存,这样,在分配完内存后,旧对像的成员变量就可以复制到新的内存区域中,
//两个对象的成员变量都各自拥有自己的内存区域,一个对象在析构后不再会影响到另一个,我们把这种复制方式叫做深层复制
#include <iostream>
using namespace std;
class A
{
public:
A(){ x = new int; *x = 9;}
~A(){ delete x; x = NULL; cout<<"析构函数执行"<<endl;}
A(const A &a){
cout<<"复制构造函数执行...."<<endl;
x = new int;
*x = *(a.x); //重新为x审请一块内存空间
}
void print()const{ cout<<*x<<endl; }
void set(int i){ *x = i;}
private:
int *x;
};
int main()
{
A *a = new A();
cout<<"a:";
a->print();
cout<<endl;
A b = (*a);
cout<<"b:";
b.print();
cout<<endl;
a->set(55);
cout<<"a:";
a->print();
cout<<endl;
cout<<"b:";
b.print();
cout<<endl;
b.set(66);
cout<<"a:";
a->print();
cout<<endl;
cout<<"b:";
b.print();
cout<<endl;
delete a;
b.print();
return 0;
}