zoukankan      html  css  js  c++  java
  • 理解拷贝构造函数

    例一:

     1 #include<iostream>
     2 using namespace std;
     3 class numbered{
     4 private:
     5     static int seq;
     6 public:
     7     numbered(){ mysn = seq++;}
     8     int mysn;        
     9 }; 
    10 int numbered::seq = 0;
    11 
    12 void f(numbered s){
    13     cout<<s.mysn<<“ ”;
    14 }
    15 int main(int argc,char**argv){
    16     numbered a,b=a,c=b;
    17     f(a);  f(b);  f(c); 
    18     return 0 ; 
    19 }
    View Code

    输出 0 0 0 

    例二:

     1 #include<iostream>
     2 using namespace std;
     3 class numbered{
     4 private:
     5     static int seq;
     6 public:
     7     numbered(){ mysn = seq++;}
     8     numbered(numbered &n) { mysn = seq++;}
     9     int mysn;        
    10 }; 
    11 int numbered::seq = 0;
    12 
    13 void f(numbered s){
    14     cout<<s.mysn<<endl;
    15 }
    16 int main(int argc,char**argv){
    17     numbered a,b=a,c=b;
    18     f(a);  f(b);  f(c); 
    19     return 0 ; 
    20 }
    View Code

    输出 3 4 5

    定义变量a时,默认构造函数起作用,序号设定为0,当定义b,c时,拷贝构造函数起作用,序号设定为1,2;

    但调用函数f时,参数类型为numbered类型,又会触发拷贝构造函数,时每一次都将形参s的序号设定为新值,输出 3 4 5。

    例三:

     1 #include<iostream>
     2 using namespace std;
     3 class numbered{
     4 private:
     5     static int seq;
     6 public:
     7     numbered(){ mysn = seq++;}
     8     numbered(numbered &n) { mysn = seq++;}
     9     int mysn;        
    10 }; 
    11 int numbered::seq = 0;
    12 
    13 void f(const numbered &s){
    14     cout<<s.mysn<<endl;
    15 }
    16 int main(int argc,char**argv){
    17     numbered a,b=a,c=b;
    18     f(a);  f(b);  f(c); 
    19     return 0 ; 
    20 }
    View Code

    输出 0 1 2

    f的参数被改为const numbered &s,形参类型由类类型转变为引用类型,传递的不是类对象而是类对象的引用,这意味着调用f将不会触发拷贝构造函数将实参拷贝给形参,而是传递实参的引用。每次调用时,s都是指向实参的引用,序号自然是实参的序号,而不是创建一个新的对象。

  • 相关阅读:
    [Algo] 306. Check If Linked List Is Palindrome
    [Algo] 42. Partition Linked List
    [Algo] 20. Search In Unknown Sized Sorted Array
    [LC] 1167. Minimum Cost to Connect Sticks
    [LC] 212. Word Search II
    安装oracle developer 10g 时报错,提示must be 5.0, 5.1, 5.2 or 6.1 . Actual 6.2
    APP-INV-05577
    客户化的并发程序出现黄条警告,并无法输出内容
    EBS Concurrent Manager(并发管理器)异常处理[final]【转】
    oracle 通过透明网关gateway 连接sqlserver
  • 原文地址:https://www.cnblogs.com/wsl96/p/13279830.html
Copyright © 2011-2022 走看看