• cpp: 指针和引用(class & object)


    cpp:  指针和引用(class & object)

     

     

     

     

    一、指针使用、引用的运用

     

     

      1、指针具有双重赋值的属性:第一重赋值,为指针变量赋值内存地址;第二重赋值,为指针变量所指的内存的存储空间赋予内容。

     

      2、(引用:cpp的特性;“引用”作为函数的参数):"引用"仍然是值传递。和普通变量相比较,“引用”只是不产生变量的临时副本。

     

     1 [root@rockylinux tmp]# uname -a
     2 Linux rockylinux 4.18.0-372.19.1.el8_6.x86_64 #1 SMP Tue Aug 2 16:19:42 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
     3 [root@rockylinux tmp]# 
     4 [root@rockylinux tmp]# 
     5 [root@rockylinux tmp]# g++ --version
     6 g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10)
     7 Copyright (C) 2018 Free Software Foundation, Inc.
     8 This is free software; see the source for copying conditions.  There is NO
     9 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    10 
    11 [root@rockylinux tmp]# 
    12 [root@rockylinux tmp]# 
    13 [root@rockylinux tmp]# cat reference.cpp 
    14 #include<iostream>
    15 
    16 
    17 using namespace std;
    18 
    19 
    20 int* return_value1(int& para)
    21 {
    22         int* tmp = &para;  // 可以获取para的地址;
    23         return tmp;
    24 }
    25 
    26 
    27 int* return_value2(int& para)
    28 {
    29         return &para;   // 可以返回para的地址;
    30 }
    31 
    32 
    33 int* return_value3(int& para)
    34 {
    35         return para;    // 如果这里报错,就说明“‘引用’是值传递”;
    36 }
    37 
    38 
    39 int main(int argc, char* argv[], char* envp[])
    40 
    41 int main(int argc, char* argv[], char* envp[])
    42 {
    43 
    44         int ref = 1949;
    45 
    46 
    47         int* pt1 = nullptr;
    48         int* pt2 = nullptr;
    49         int* pt3 = nullptr;
    50 
    51 
    52         pt1 = return_value1(ref);
    53         cout << "pt1 = " << *pt1 << endl;
    54         pt2 = return_value2(ref);
    55         cout << "pt2 = " << *pt2 << endl;
    56         pt3 = return_value3(ref);
    57         cout << "pt3 = " << *pt3 << endl;
    58 
    59 
    60         return 0;
    61 
    62 
    63 }
    64 [root@rockylinux tmp]# 
    65 [root@rockylinux tmp]# 
    66 [root@rockylinux tmp]# g++ -o reference reference.cpp 
    67 reference.cpp: In function ‘int* return_value3(int&)’:
    68 reference.cpp:22:9: error: invalid conversion fromint’ to ‘int*’ [-fpermissive]
    69   return para; // 如果这里报错,就说明“‘引用’是值传递”;
    70          ^~~~
    71 reference.cpp: At global scope:
    72 reference.cpp:28:1: error: expected initializer before ‘int73  int main(int argc, char* argv[], char* envp[])
    74  ^~~
    75 [root@rockylinux tmp]# 
    76 [root@rockylinux tmp]# 

     

     

     

     

    二、代码和运行结果

     

      1 [root@rockylinux tmp]# uname -a
      2 Linux rockylinux 4.18.0-372.19.1.el8_6.x86_64 #1 SMP Tue Aug 2 16:19:42 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
      3 [root@rockylinux tmp]# 
      4 [root@rockylinux tmp]# 
      5 [root@rockylinux tmp]# g++ --version
      6 g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10)
      7 Copyright (C) 2018 Free Software Foundation, Inc.
      8 This is free software; see the source for copying conditions.  There is NO
      9 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     10 
     11 [root@rockylinux tmp]# 
     12 [root@rockylinux tmp]# 
     13 [root@rockylinux tmp]# cat mix_data_structure.cpp 
     14 #include<iostream>
     15 #include<string>
     16 
     17 
     18 using namespace std;
     19 
     20 
     21 template<typename N, typename I>
     22 struct persion{
     23         string uid;
     24         N uname;
     25         I uinformation;
     26 };
     27 
     28 
     29 class msg
     30 {
     31 public:
     32         msg()
     33         {
     34                 uid = new string;
     35                 uname = new string;
     36                 uinformation = new string;
     37         }
     38         msg(string* id, string* name, string* info)
     39         { 
     40                 uid = new string;
     41                 uname = new string;
     42                 uinformation = new string;
     43 
     44                 *uid=*id; 
     45                 *uname=*name;
     46                 *uinformation=*info;
     47         }
     48         msg(const msg* message)
     49         {
     50                 uid = new string;
     51                 uname = new string;
     52                 uinformation = new string;
     53 
     54                 *uid = *message->uid;
     55                 *uname = *message->uname;
     56                 *uinformation = *message->uinformation;
     57         }
     58         ~msg(){ delete uid; delete uname; delete uinformation;}
     59 
     60 
     61         void set_uid(string* id)
     62         {
     63                 *uid=*id;
     64         }
     65 
     66         string* get_uid()
     67         {
     68                 return uid;
     69         }
     70 
     71 
     72         void set_uname(string* name)
     73         {
     74                 *uname=*name;
     75         }
     76 
     77         string* get_uname()
     78         {
     79                 return uname;
     80         }
     81 
     82         void set_uinformation(string* info)
     83         {
     84                 *uinformation=*info;
     85         }
     86 
     87         string* get_uinformation()
     88         {
     89                 return uinformation;
     90         }
     91 private:
     92         string* uid;
     93         string* uname;
     94         string* uinformation;
     95 };
     96 
     97 
     98 template<class N, class I>
     99 class student
    100 {
    101 public:
    102         student(){ stud.uid="usr_null"; stud.uname="usr_null"; stud.uinformation="usr_null";}
    103         student(string* id, N* name, I* info){ stud.uid=*id; stud.uname=*name; stud.uinformation=*info;}
    104         student(const student& st){ stud.uid=st.uid; stud.uname=st.uname; stud.uinformation=st.uinformation;}
    105         void set_all(string id, N name, I info){ stud.uid=id; stud.uname=name, stud.uinformation=info;}
    106         string get_uid(){ return stud.uid;}
    107         N get_uname(){ return stud.uname;}
    108         I get_uinformation(){ return stud.uinformation;}
    109         void print_result()
    110         {
    111                 cout << "OS_STUDENT:";
    112                 cout << "\tid=" << stud.uid;
    113                 cout << ",\tname=" << stud.uname;
    114                 cout << ",\tinformation=" << stud.uinformation << endl;
    115         }
    116 private:
    117         persion<N,I> stud;
    118 };
    119 
    120 
    121 class teacher
    122 {
    123 public:
    124         teacher(){ message = new msg;}
    125         teacher(string* id, string* name, string* info)
    126         { 
    127                 message= new msg; 
    128                 message->set_uid(id);
    129                 message->set_uname(name); 
    130                 message->set_uinformation(info);
    131         }
    132         teacher(const teacher& t)
    133         { 
    134                 message = new msg;
    135                 message ->set_uid(t.message->get_uid()); 
    136                 message ->set_uname(t.message->get_uname());
    137                 message ->set_uinformation(t.message->get_uinformation());
    138         }
    139         ~teacher(){delete message;}
    140         void print_result()
    141         {
    142                 cout <<"OS_TEACHER:";
    143                 cout <<"\tid=" << *message->get_uid();
    144                 cout <<",\tname="<< *message->get_uname();
    145                 cout <<",\tinformation="<< *message->get_uinformation()<< endl;
    146         }
    147 private:
    148         msg* message;
    149 };
    150 
    151 
    152 
    153 int main(int argc, char* argv[], char* envp[])
    154 {
    155 
    156         string id = "20220830";
    157         string name = "tiger";
    158         string info = "forest_universe";
    159 
    160         string* pointer_id = &id;
    161         string* pointer_name = &name;
    162         string* pointer_info = &info;
    163 
    164 
    165         student<string, string> st(pointer_id, pointer_name, pointer_info);
    166         st.print_result();
    167 
    168 
    169         teacher tr(pointer_id, pointer_name, pointer_info);
    170         tr.print_result();
    171 
    172 
    173         return 0;
    174 
    175 
    176 }
    177 [root@rockylinux tmp]# 
    178 [root@rockylinux tmp]# 
    179 [root@rockylinux tmp]# g++ -o mix_data_structure mix_data_structure.cpp 
    180 [root@rockylinux tmp]# 
    181 [root@rockylinux tmp]# 
    182 [root@rockylinux tmp]# ./mix_data_structure 
    183 OS_STUDENT:     id=20220830,    name=tiger,     information=forest_universe
    184 OS_TEACHER:     id=20220830,    name=tiger,     information=forest_universe
    185 [root@rockylinux tmp]# 
    186 [root@rockylinux tmp]# 

     

     

  • 相关阅读:
    Activity
    日志
    StringBuffer
    内部类
    接口
    多态
    final关键字
    abstract关键字
    对象初始化
    继承
  • 原文地址:https://www.cnblogs.com/lnlidawei/p/16640495.html
Copyright © 2020-2023  润新知