関数リロードとデフォルトパラメータのノット
導入:
なぜ関数を再ロードするのですか?
この問題は実は関数の名前の衝突の問題を解決するためで、もし1つの方法が動作して洗うならば、それでは洗車して服を洗って靴下を洗うのがすべて具体的な名前でなければならなくて、このように多いのはよくありません!
必然性:
名前を書くのは煩わしくても、必然的ではありませんが、構造関数の実現には、多重または多種類のインスタンスをインスタンス化する必要がある場合はどうすればいいのか、同じように再ロードしなければなりません.
なぜ戻り値で再ロードできないのですか?
この質問の答えは、一般的にコンパイラ内部で関数の名前を変更します.一般的な方法は、関数名+パラメータタイプ1+パラメータタイプ2+パラメータタイプ3+です.の
見たでしょう、新しい名前は全然戻り値がないので、戻り値を再ロードするのはだめです.c++も禁止です.
さらに悪い問題は、どの関数が呼び出されるか分からないことです.
関数にデフォルトのパラメータが必要なのはなぜですか?
この問題の答えは実は上の問題にまとめることができて、関数が複数重荷された後、必然的なパラメータもいろいろな(重荷はパラメータを動かすしかない)関数がたくさんあるかもしれませんが、少し違います.
毎回調整しなければなりません
すべていくつかの山のパラメータが必要で、これは私はこのようにしたくないので、この方法で問題を解決します
詳細:
タイプのセキュリティ接続
コンパイラが実行可能ファイルを生成するときはコンパイル-』接続です.
また、コンパイルするときに、時間を節約するために単一のファイルをコンパイルし、1つのファイルが1つのコンパイルユニットであり、コネクタで偶数のコンパイルユニットを接続して実行可能なファイルを再生成するのは、そのためです.
マシン
ちょっとした大問題にもなった
現在2つのファイルがある場合、そのうち1.cppには以下の定義がある
そして2.cppには次のような声明があります.
単一ファイルのコンパイルメカニズムであるため、1.cpp, 2.cppはいずれもコンパイルに成功し、cではリンクも成功するので、cのコンパイラではひげの白を見つける発見しにくいバグが発生しますが、c++のコンパイラでは、上(なぜ戻り値で再ロードできないのですか?)のこのメカニズムでは、このエラーが検出され、タイプのセキュリティリンクが表示されます.だからc++コンパイラでcプロジェクトのバグを探すのは気持ちがいいです.
重荷の例
ややよくなった
デフォルトパラメータの例
同上よし
リロードとデフォルトのどちらを選択しますか?
これは省略しないでください.
stringクラスを自作する:
1. mem.h、これは自分で書いたメモリ管理のヘッダファイルです.
2. mem.cpp対mem.hの中の声明は定義する:
3. MyString.cpp、これが自分のstringクラスです.
上記のコードから、次の特性がわかります.
MyString()とMyString(char*str)は同時にありますが、パラメータのない主に空のstringを同時に作成するためです.ここでの時間の費用はbufに初期値0を払っただけです.デフォルトのパラメータを使用すると形式が異なり、費用が大きくなります.
デフォルトパラメータを1つのフラグとして実行関数のどのブロックを決定することはできません.これは鉄の一般的な定則です.このようなやり方を避けるには、関数を分割または複数再ロードし、上のMySstringだけで実行関数のどちらを決定するかではなく、デフォルトパラメータを使用して再ロードします.
大放送
デフォルトパラメータの重要な応用は、関数の定義を開始するときにパラメータのセットを使用することです.今年に入ってから、お客様が新しい機能を追加すると、この関数のパラメータの個数を増やす必要がある可能性が高いので、このときに新しいパラメータをデフォルトパラメータとして使用することができます.これで以前この関数を呼び出したコードをまったく変える必要がなくなり、手間が省けます.
まとめ:
少しぐずぐずしている
なぜ関数を再ロードするのですか?
この問題は実は関数の名前の衝突の問題を解決するためで、もし1つの方法が動作して洗うならば、それでは洗車して服を洗って靴下を洗うのがすべて具体的な名前でなければならなくて、このように多いのはよくありません!
必然性:
名前を書くのは煩わしくても、必然的ではありませんが、構造関数の実現には、多重または多種類のインスタンスをインスタンス化する必要がある場合はどうすればいいのか、同じように再ロードしなければなりません.
なぜ戻り値で再ロードできないのですか?
この質問の答えは、一般的にコンパイラ内部で関数の名前を変更します.一般的な方法は、関数名+パラメータタイプ1+パラメータタイプ2+パラメータタイプ3+です.の
見たでしょう、新しい名前は全然戻り値がないので、戻り値を再ロードするのはだめです.c++も禁止です.
さらに悪い問題は、どの関数が呼び出されるか分からないことです.
関数にデフォルトのパラメータが必要なのはなぜですか?
この問題の答えは実は上の問題にまとめることができて、関数が複数重荷された後、必然的なパラメータもいろいろな(重荷はパラメータを動かすしかない)関数がたくさんあるかもしれませんが、少し違います.
毎回調整しなければなりません
すべていくつかの山のパラメータが必要で、これは私はこのようにしたくないので、この方法で問題を解決します
詳細:
タイプのセキュリティ接続
コンパイラが実行可能ファイルを生成するときはコンパイル-』接続です.
また、コンパイルするときに、時間を節約するために単一のファイルをコンパイルし、1つのファイルが1つのコンパイルユニットであり、コネクタで偶数のコンパイルユニットを接続して実行可能なファイルを再生成するのは、そのためです.
マシン
ちょっとした大問題にもなった
現在2つのファイルがある場合、そのうち1.cppには以下の定義がある
//1.cpp
void oyl(int v){}
そして2.cppには次のような声明があります.
void oyl(char v);
単一ファイルのコンパイルメカニズムであるため、1.cpp, 2.cppはいずれもコンパイルに成功し、cではリンクも成功するので、cのコンパイラではひげの白を見つける発見しにくいバグが発生しますが、c++のコンパイラでは、上(なぜ戻り値で再ロードできないのですか?)のこのメカニズムでは、このエラーが検出され、タイプのセキュリティリンクが表示されます.だからc++コンパイラでcプロジェクトのバグを探すのは気持ちがいいです.
重荷の例
ややよくなった
デフォルトパラメータの例
同上よし
リロードとデフォルトのどちらを選択しますか?
これは省略しないでください.
stringクラスを自作する:
1. mem.h、これは自分で書いたメモリ管理のヘッダファイルです.
/*
encoding by ygqwan
in 2013/ 8 / 10
*/
//: mem.h
#define MEM_H
typedef unsigned char byte;
class Mem
{
byte * mem; //
int size; //
void ensureMinSize(int minSize); // minSize
public:
Mem();
Mem(int sz); // sz
~Mem();
int msize();
byte *pointer(); //
byte *pointer(int minSize); // ,
};
2. mem.cpp対mem.hの中の声明は定義する:
/*
encoding by ygqwan
in 2013/ 8 / 10
*/
//:mem.cpp ,
#include "mem.h"
#include <cstring>
using namespace std;
Mem::Mem(){
mem = 0;
size = 0;
}
Mem::Mem(int sz){
mem = 0;
size = 0;
ensureMinSize(sz);
}
Mem::~Mem(){
delete []mem;
}
int Mem::msize(){
return size;
}
void Mem::ensureMinSize(int minSize){
if(size < minSize){
byte *newmem = new byte[minSize];
memset(newmem + size, 0, minSize - size);
memcpy(newmem, mem, size);
delete []mem;
mem = newmem;
size = minSize;
}
}
byte* Mem::pointer(){
return mem;
}
byte* Mem::pointer(int minSize){
ensureMinSize(minSize);
return mem;
}
3. MyString.cpp、これが自分のstringクラスです.
/*
encoding by ygqwan
in 2013/ 8 / 10
*/
#include "mem.h"
#include <cstring>
#include <iostream>
using namespace std;
class MyString
{
Mem *buf;
public:
MyString();
MyString(char * str);
~MyString();
void concat(char * str); // str
void print(ostream & os);
};
MyString::MyString(){ buf = 0;}
MyString::MyString(char *str){
buf = new Mem(strlen(str) + 1);
strcpy((char *)buf->pointer(), str);
}
void MyString::concat(char * str){
if(!buf)
buf = new Mem();
strcat((char *)buf->pointer(buf->msize() + strlen(str)), str);
}
void MyString::print(ostream & os){
if(!buf) return;
os << buf->pointer() << endl;
}
MyString::~MyString(){
delete buf;
}
int main()
{
MyString * s = new MyString("oyl");
s->concat("wan");
s->print(cout);
MyString * s2 = new MyString();
s2->concat("...wan");
s2->print(cout);
return 0;
}
MyString(char *str)
{
if(*str == 0)
buf = 0;
return;
}
上記のコードから、次の特性がわかります.
MyString()とMyString(char*str)は同時にありますが、パラメータのない主に空のstringを同時に作成するためです.ここでの時間の費用はbufに初期値0を払っただけです.デフォルトのパラメータを使用すると形式が異なり、費用が大きくなります.
デフォルトパラメータを1つのフラグとして実行関数のどのブロックを決定することはできません.これは鉄の一般的な定則です.このようなやり方を避けるには、関数を分割または複数再ロードし、上のMySstringだけで実行関数のどちらを決定するかではなく、デフォルトパラメータを使用して再ロードします.
大放送
デフォルトパラメータの重要な応用は、関数の定義を開始するときにパラメータのセットを使用することです.今年に入ってから、お客様が新しい機能を追加すると、この関数のパラメータの個数を増やす必要がある可能性が高いので、このときに新しいパラメータをデフォルトパラメータとして使用することができます.これで以前この関数を呼び出したコードをまったく変える必要がなくなり、手間が省けます.
まとめ:
少しぐずぐずしている