寫了這樣一個測驗程式
頭檔案:
#ifndef C_TEST_BASICCONCEPTTEST_H
#define C_TEST_BASICCONCEPTTEST_H
#include <iostream>
class cal {
public:
friend std::ostream &operator<<(std::ostream &os, const cal &print) ;
friend cal operator+(const cal &left, const cal &right);
cal() = default;
cal(int left, int right) : member1_(left), member2_(right) {}
cal(int right) : cal(3, right) {}
cal(const cal &another) : member1_(another.member1_), member2_(another.member2_) {}
~cal() = default;
cal& operator +(const cal& right);
cal &operator=(const cal &right);
private:
int member1_;
int member2_;
};
class cal & cal::operator+(const class cal & right) {
std::cout << "member function + invoked" << std::endl;
this->member1_ += right.member1_;
this->member2_ += right.member2_;
return *this;
}
class cal & cal::operator=(const class cal & right) {
this->member1_ = right.member1_;
this->member2_ = right.member2_;
return *this;
}
std::ostream& operator << (std::ostream& os, const cal& print) {
os << "member1_: " << print.member1_ << " , member2_: " << print.member2_ ;
}
class cal operator+(const class cal & left, const class cal & right) {
std::cout << "friend function + invoked" << std::endl;
cal temp;
temp.member1_ = left.member1_ + right.member1_;
temp.member2_ = left.member2_ + right.member2_;
return temp;
}
#endif //C_TEST_BASICCONCEPTTEST_H
這是源檔案
#include "basicConceptTest.h"
int main(int argc, char **argv){
cal data1(1, 2), data2(6), data3(data1);
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data3 = data1 + data2; // (1,2) + (3, 6) = (4, 8) after that data1 changed to (4,8)
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data3 = operator+(data1, data3); //(4, 8) + (4, 8) = (8, 16)
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data2 = data1.operator+(data3);
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
return 0;
}
執行后發現一切正常,符合預期
于是做了一點改動
void test(void);
int main(int argc, char **argv){
test();
return 0;
}
void test(void)
{
cal data1(1, 2), data2(6), data3(data1);
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data3 = data1 + data2; // (1,2) + (3, 6) = (4, 8) after that data1 changed to (4,8)
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data3 = operator+(data1, data3); //(4, 8) + (4, 8) = (5, 10)
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
data2 = data1.operator+(data3);
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
std::cout << "data3: " << data3 << std::endl;
std::cout << std::endl;
}
奇怪的事情發生了,報錯Process finished with exit code 139 (interrupted by signal 11: SIGSEGV),我又試了一下使用debug模式來運行,發現又可以正常運行了.用release模式就不行.而且main函式里面運行的好好的,放到一個函式里面就有問題了,怎么回事呢?
后來檢查了一下代碼,才發現,我的運算子多載函式寫的有問題:
std::ostream& operator << (std::ostream& os, const cal& print) {
os << "member1_: " << print.member1_ << " , member2_: " << print.member2_ ;
}沒有回傳一個輸出流
在后面加一條return 陳述句
std::ostream& operator << (std::ostream& os, const cal& print) {
os << "member1_: " << print.member1_ << " , member2_: " << print.member2_ ;
return os;
}
再運行就沒有問題了.
但是為什么剛在在mian 函式里面就可以運行呢?我還是不明白........
uj5u.com熱心網友回復:
建議:先把基本的語法學好。。。。。。。。
uj5u.com熱心網友回復:
說的有道理,現在正在看書學,能不能說明白一點啊?uj5u.com熱心網友回復:
class cal & cal::operator=(const class cal & right) {
this->member1_ = right.member1_;
見到這樣的代碼。。。。。。。。。
c++ 直接 cal & cal::operator=(const class cal & right) {
this->member1_ = right.member1_;
uj5u.com熱心網友回復:
cal & cal::operator=(const cal & right) {
this->member1_ = right.member1_;
uj5u.com熱心網友回復:
cal & cal::operator=(const cal & right) {
this->member1_ = right.member1_;uj5u.com熱心網友回復:
operator=不要回傳參考,而是值uj5u.com熱心網友回復:
上邊寫錯是operator+,不是operator=轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66075.html
標籤:C++ 語言
