一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 詳解C++構造函數

詳解C++構造函數

2022-02-25 14:41weixin_46369425 C/C++

這篇文章主要為大家介紹了C++構造函數,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.作用

一種特殊類型的方法,在每次實例化對象時運行

 

2.代碼舉例

2.1 示例1:

#include <iostream>
class A
{
  public:
      float a, b;
      void print()
      {
          std::cout << a <<  " ,  " << b << std :: endl;
      }
};
int main()
{
  A a;
  a.print();
  return 1;
}

運行結果:

詳解C++構造函數

當我們實例化A,系統為它分配內存,我們沒有初始化內存,得到的是內存空間原有的那些東西

2.2 示例2:

當在main中添加 std::cout << a.a << " , " << a.b << std :: endl;

int main()
{
  A a;
  std::cout << a.a <<  " ,  " << a.b << std :: endl;
  a.print();
  return 1;
}

(ubuntu下 vs code )運行結果

詳解C++構造函數

不同編譯器可能不一樣,有的會編譯不過報錯(未初始化局部變量),原因有待深入…

 

3. 使用

3.1 使用構造函數初始化

#include <iostream>
class A
{
  public:
      float a, b;
      A ()
      {
          a = 0.0f;
          b = 0.0f;
      }
      void print()
      {
          std::cout << a <<  " ,  " << b << std :: endl;
      }
};
int main()
{
  A a;
  std::cout << a.a <<  " ,  " << a.b << std :: endl;
  a.print();
  return 1;
}

結果:

詳解C++構造函數

3.2 有參數的構造函數

#include <iostream>
class A
{
  public:
      float a, b;
  // 無參構造
  A ()
      {
          a = 0.0f;
          b = 0.0f;
      }
  // 有參構造
      A(float c,float d)
      {
          a = c;
          b = d;
      }
  
      void print()
      {
          std::cout << a <<  " ,  " << b << std :: endl;
      }
};
int main()
{
  A a(5.0,6.0);
  std::cout << a.a <<  " ,  " << a.b << std :: endl;
  a.print();
  return 1;
}

一個類可以有很多構造函數 前提是參數個數不同或者參數類型不同

類似于同名函數(函數重載 即有相同的函數名,但是有不同的參數個數與參數類型)

A(float c,float d)
{
}
A(int c,int d)
{
}
A(float c,float d,float e)
{
}

這里需要注意有參構造的時候注意傳值類型

如 float 類型

A a(5.0f , 6.0f);

3.3 默認的構造函數

每個類默認有一個空參空實體的構造函數(如果寫了構造函數,則默認構造函數就沒有了,需要時需手動添加)

A ()
{
}

如果不想使用構造函數有兩種方法

// 1 私有化
private :
	A(){}
// 2 刪掉
A() = delete;

 

4. 成員初始化列表

例1:正常初始化

#include <iostream>
using namespace std;
class Student
{
private:
  const char *m_name;
  int m_age;
  float m_score;
public:
  // 無參構造 給變量賦定值
  Student()
  {
      m_name = "aaa";
      m_age = 1;
      m_score = 99.0;
  }
  // 有參構造  給變量動態賦值
  Student(const char *name, int age, float score)
  {
      m_name = name;
      m_age = age;
      m_score = score;
  }
  void print ()
  {
      cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
  }
};
int main(int argc, char const *argv[])
{
  Student s1;
  s1.print();
  Student s2("ccc" , 2 , 99.3f);
  s2.print();
  return 0;
}

例2:成員初始化列表

#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
  // string m_name;
  // char *m_name;
  const char *m_name;
  int m_age;
  float m_score;
public:   
  //  無參 成員初始化列表  
  Student() 
      : m_name("bbb") , m_age(2) , m_score(93.0f) 
  {
      // TODO
  }
  // 有參 成員初始化列表  
  /**
   *  const char *name    常量指針     const 修飾*name   *name不可改變
   *  char * const name   指針常量     const 修飾 name   name不可改變
   *  char const *name    常量指針 等同于 const char *name 
   * 
   *  這里不寫const 會報警告  但可以編過  
   *  
  */
  Student(const char *name, int age, float score)
      : m_name(name) , m_age(age) , m_score(score)
  {
     // TODO
  }
  void print ()
  {
      cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
  }
};
int main(int argc, char const *argv[])
{
  Student s1;
  s1.print();
  Student s2("ccc",2,99.3f);
  s2.print();
  return 0;
}

運行結果都一樣:

aaa ,1 ,99
ccc ,2 ,99.3

使用構造函數初始化列表并沒有效率上的優勢,僅僅是書寫方便,尤其是成員變量較多時,這種寫法非常簡單明了。

初始化列表可以用于全部成員變量,也可以只用于部分成員變量

Student(char *name, int age, float score): m_name(name){
  m_age = age;
  m_score = score;
}

NOTE:成員變量的初始化順序與初始化列表中列出的變量的順序無關,它只與成員變量在類中聲明的順序有關。

為啥推薦成員初始化列表的寫法?

#include <iostream>
using namespace std;
class Example
{
public:
  Example()
  {
      cout<< "Create Example" << endl;
  }
  Example(int x)
  {
      cout<< "Create Example with "  << x << endl;
  }
};
class A
{
private:
  string m_name;
  // 創建了 Example 的無參構造 對象
  Example m_Example;
public:
  A()
  {
      m_name = "name";
      // 創建新的有參構造對象覆蓋第一次賦值  
      m_Example = Example(1);
  }
};
int main(int argc, char const *argv[])
{
  A a;
  return 0;
}

結果:

詳解C++構造函數

A的構造函數換成成員初始化列表的寫法

//    A() : m_name ("name"),m_Example(Example(1))  		與下面寫法相同
A() : m_name ("name"),m_Example(1)
  {
  }

結果:

詳解C++構造函數

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_46369425/article/details/121362707

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 精品国产精品国产偷麻豆 | 日韩久久网 | 亚洲精品一区制服丝袜 | videos欧美肥婆 | 欧美人禽杂交狂配无删完整 | 满溢游泳池免费土豪全集下拉版 | 日韩亚洲人成网站在线播放 | 性美国人xxxxx18 | 大香线一本 | 高清在线一区二区 | 小货SAO边洗澡边CAO你动漫 | jazz欧美人免费xxxxxx | 日本一区二区在线不卡 | 成人做视频免费 | 超爽人人做人人爽 | 超级碰碰免费视频 | 99久久免费国产精品热 | chinese野外gay军人 | 日麻逼 | voyeur 中国女厕 亚洲女厕 | 日韩欧美亚洲天堂 | 国产在视频线在精品 | 欧美日韩高清完整版在线观看免费 | 天堂中文在线观看 | 国产高清在线视频一区二区三区 | 欧美日韩视频一区三区二区 | 女生被爆操 | 精品一产品大全 | 国产精品第一区揄拍 | 热99在线观看| 糖心在线观看网 | xxx中国bbbwww | 99精品视频免费 | 日韩在线观看网站 | 国产成人综合手机在线播放 | 娇妻与公陈峰姚瑶最新版 | 亚洲精品6久久久久中文字幕 | 超碰成人在线播放 | 好姑娘在线完整版视频 | 青青青国产视频 | 色人阁小说 |