zoukankan      html  css  js  c++  java
  • 第十章 深入函数 简单

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

      

  • 相关阅读:
    数据库表分区
    将对象序列化成XML字符串
    [邀月博客] SQL Server 2008中SQL增强之二:Top新用途
    多线程:子线程执行过程中调用主线程
    Jquery版文字闪烁
    金马自定义对联
    清除数据
    QQ、微信、QQ浏览器UserAgent
    jump.html域名跳转javascript版
    注册页面位置调整
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2552908.html
Copyright © 2011-2022 走看看