友元函数<<的模板化

1、构造函数的一种使用

成都创新互联是专业的历城网站建设公司,历城接单;提供网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行历城网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

int main(void){
    //Test t1 = 10;// 在构造函数中寻找只有一个参数的
    
    //手动的调用构造函数;
    Test t2 = Test(1, 2);  //直接调用构造函数--->匿名对象;
    //直接调用Test的有参构造函数,初始化t2对象;  只会调用一次构造函数(直接把匿名对象转成t2);
    
}

2、构造与赋值语句

Test g(){
    
    //返回为对象,我就给你返回一个新的对象(匿名对象);
}

int main(void){
    Test t1(1, 2); 
    Test t2; 

    Test t3 = t1; //用t1初始化t3,调用拷贝构造函数;
    Test t3(t1);
    t2 = t1; //利用t1给t2赋值,调用赋值语句;

    Test m = g(); //函数的返回值为对象,用匿名对象初始化m,此时C++编译器将直接把匿名对象转化为有名对象m;
    m = g();//此时匿名对象将没有用,赋值完成,没有转正,将被析构

}

//在定义类时,只要你写了构造函数,则必须要用你自己写的,此时C++编译器将不会给你提供默认的构造和拷贝构造函
数

3、构造函数的执行顺序

  执行顺序:先执行被组合对象的构造函数,如果有多个,按定义顺序执行,而不是按初始化列表的顺序执行;
  析构函数的调用顺序相反;

  初始化列表用来给const属性赋值;

代码如下:

#include
using namespace std;

class A{
    public:
        A(int a){ 
            m = a;
        }   
    private:
        int m;
};
    //在构造中调用构造函数是一种危险的行为,里面是一个匿名对象;用完立即调用析构,
    //参数列表也可以在拷贝构造函数上面使用;
class B{
    public:  //构造函数的初始化列表:解决,在B类中,组合了A类对象,
            //根据构造函数的规则,写了A类的构造函数,必须要用;
        B(int q, int a, int b, int c) : a1(b), a2(c), c(0){
            x = q;
            y = a;
        }   
    //执行顺序:先执行被组合对象的构造函数,如果有多个,按定义顺序执行,而不是按初始化列表的顺序执行;
    //析构函数的调用顺序相反;
    //构造调用顺序:a1、a2、b
    //初始化列表用来给const属性赋值;
    private:
        int x;
        int y;
        A a1;
        A a2;
        const int c;  //常量c必须初始化(通过参数列表)
};

int main(void){
    B b(1, 2, 3, 4);
}

4、new和delete

  new能执行类的构造函数,delete能行类的析构函数;

  malloc free new delete可以互换使用,只不过new先开辟空间-->调用构造;delete--->先析构,在释放空间;

5、static

  静态成员不占这个类的字节的大小;------->不属于这个实例的,相当于全局变量;

(1)、代码如下:

#include
using namespace std;

class A{
    public:
        A(){}
        int getD(){
            return d;
        }
        void Add(){
            d++;
        }   
        static void getC(){ //静态成员函数;
            //静态方法只能调用静态的成员、函数;
            cout<<"d:"<

(2)、运行结果:

友元函数<<的模板化

6、赋值语句(重载=运算符难点)
  i>、先把旧的内存释放掉;
  ii>、返回一个引用;  为了支持连等;
  iii>、根据大小分配内存;

7、继承中的字节大小

  子类继承父类,在访问上有所限制,但是在内存空间上对属性成员是全部的继承了下来;静态变量在全局区,所以对静态变量不计入字节大小的计算;

  class M{};//空的类,占一个标示,1字节;


8、函数模板

  普通函数的调用:可以进行隐式的类型转换
  函数模版的调用:将严格按照类型进行匹配,不会进行自动类型转换;


9、友元函数的模板化

对友元函数实现<<运算符重载

(1)、代码如下:

#include
using namespace std;


//结论:友元函数的类模版比较复杂;

template
class Complex; //类的前置声明
template
ostream& operator<<(ostream &out, const Complex &c);//友元函数的前置声明


template
class Complex{
    public:
        friend ostream& operator<<(ostream &out, const Complex &c); //对<<的后面加上
;进行友元函数的模版化;
        Complex(Type a, Type b); 
        Complex(const Complex &c){}
        Complex& operator=(const Complex &c){}
        ~Complex(){}
    public:
        void printComplex();
        Complex operator+(const Complex &c);
    private:
        Type a;
        Type b;
};

//成员函数实现 + 
template
Complex::Complex(Type a, Type b){
    this->a = a;
    this->b = b;
}
template
void Complex::printComplex(){
    cout<<"a:"<
Complex Complex::operator+(const Complex &c){
    return Complex(a+c.a, b+c.b);
}

//友元函数实现<<运算符重载
template
ostream& operator<<(ostream &out, const Complex &c){
    out<<"("< c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2;
    cout<

(2)、运行结果

友元函数<<的模板化


文章题目:友元函数<<的模板化
分享URL:http://pwwzsj.com/article/jeoeio.html