首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 類繼承構造函數調用與字符指針深拷貝修正

     編輯:程式設計綜合問答

原代碼存在多個關鍵錯誤:char* name 淺拷貝導致雙重釋放、構造函數參數應為 const char*、cout << a.PrintName() 嘗試輸出 void 返回值。

修正後完整代碼

#include <iostream>
#include <cstring>
using namespace std;

class Person {
private:
    char* name;
public:
    Person(const char* n) {           // const char* 參數
        name = new char[strlen(n) + 1];
        strcpy(name, n);              // 深拷貝
    }
    ~Person() { delete[] name; }      // 析構釋放
    // 拷貝構造/賦值運算符 (三/五法則) 略,實際必須實現
    void PrintName() const {          // const 成員函數
        cout << "The name is: " << name;
    }
};

class Student : public Person {
private:
    long number;
public:
    Student(const char* n, long num) : Person(n), number(num) {}
    void PrintInfo() const {
        PrintName();                  // 調用基類方法
        cout << ", The number is: " << number;
    }
};

int main() {
    Person a("張三");
    a.PrintName();                    // 直接調用,無返回值
    cout << endl;

    Student b("李四", 142180217);
    b.PrintInfo();
    cout << endl;
    return 0;
}

核心修正點

  1. 深拷貝:name = new char[...]; strcpy(...),析構 delete[]。
  2. const 正確性:參數 const char*,方法 const。
  3. 輸出邏輯:PrintName() 內部輸出,main 中直接調用,不嘗試 cout << void。
  4. 字符串字面量:Person a("張三") 直接傳字面量,無需臨時 char[] (C++ 自動轉換)。

進階:三/五法則

管理動態內存的類必須實現:

  • 拷貝構造函數
  • 拷貝賦值運算符
  • 移動構造函數 (C++11)
  • 移動賦值運算符 (C++11)
  • 析構函數

或使用 std::string 替代 char* 由編譯器自動生成 (Rule of Zero)。

修正內存管理與輸出邏輯,程序正常運行輸出姓名與學號。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved