2

Andrei による Modern C++ Design を読んでいます。

"Pointers to allocated objects does not have a value semantics"

値のセマンティックの例では、「int」が最適であることが言及されています。それで

int x = 200, y;
y = x;

私の質問?

1) 「値セマンティック」であると主張できるように考慮すべきパラメーターは何ですか? 2) オブジェクトへのポインタが「値セマンティック」であると主張していない理由。

私は何を理解しましたか?

元の変数から完全に切り離された別の変数に変数をコピーできない場合、それは「値のセマンティクス」です。

私の理解が間違っている場合は、親切に修正してください。また、いくつかの簡単な例も示してください。

4

8 に答える 8

2

「値のセマンティクス」というフレーズは広く使用されていますが、一般的に定義はかなり緩いものです。Scott Meyers の定義は、「int と同じように実行する」という適切な定義だったと思います。

言い換えれば、値のセマンティクスを持つオブジェクトは、ほとんど int のように扱うことができるオブジェクトであり、そうしても、通常は驚くべきことは何もしません。コピー、代入、適用演算子など、すべて「そのまま」です。あなたが作成したそれぞれの「もの」は他のものから独立しているので、(たとえば)使用したかのようにx + y変化xしませんx += y(これは (完全に不公平な数の) 文字列クラスが行った例です)。

于 2013-01-24T15:11:55.597 に答える
2

The quote seems to be out of context.

Plain pointers do have value semantics:

char const *x = "x", *y;
y = x;

These are C++ references that don't have value semantics. They can be initialized but not re-assigned.

The quote probably refers to function argument passing: an argument to a function can be passed by value (copied) or by reference. By reference in this context means passing by pointer or accepting a reference. In this context an object passed by reference doesn't have value semantics, i.e. no copy of an object is done and all changes to an object made by a function are visible when the function returns. However, all function arguments are copies, in a sense: the arguments the caller supplies get copied into the stack frame (or passed in registers as an optimization) of the called function. Passing by reference fundamentally means passing an address of an object (via pointer or reference). No matter how many times one copies an address it still points to the same object.

于 2013-01-24T15:10:18.717 に答える
1

あなたが理解していることは正しいです。以下に例を示します。

string* str_rptr = new string("hello");
string* str2_rptr = str_rptr;
str2_rptr->replace(0,5,"goodbye");

std::cout << *str_rptr << std::endl;

このフラグメントの出力は、「こんにちは」ではなく「さようなら」を出力します。あなたが与えた「完全なint」の例の後、このコード:

y = 400;
std::cout << x << std::endl;

「200」と出力されます。重要な点は、変数をコピーしても、一方の変更が他方の変更を妨げないということです。

于 2013-01-24T15:11:33.583 に答える
1

ここで値のセマンティクスを参照してください。

つまり、オブジェクトへのポインター (または参照) は、新しい一意のオブジェクトではありませんが、ポインターは、それが指すようにした元のオブジェクトを参照します。そのため、ポインターには注意する必要があるため、何を指しているのか、ポインターが指している何かを変更すると何が変わるのかを確認してください。

逆に、渡された値の内容を変更する関数を書くことができなかったので、(少なくとも C では) 「値のセマンティクス」を常に完全に使用することはできませんでした。

于 2013-01-24T15:14:37.910 に答える
1

値のセマンティクスとは、たとえば seta = bの場合、a は b のコピーであり、同じ値を持ちますが、b から分離されているため、その後 b を使用しても、a には b の元の値が含まれていることを意味します。

int a, b = 5;
a = b; //a is 5 now
b = 7; //a is still 5!

//in contrast to pointers:
int* pb = new int(5);
int* pa = pb; //*a is 5 now
*pb = 7; //*a is not 5 any more, it's 7!

その例では、a と b は切り離されていないため、値のセマンティクスはありません。

于 2013-01-24T15:14:42.457 に答える
0

私が見つけることができるあなたの質問に対する最も簡潔な説明は、「値のセマンティクスは、コピー/クローンの変更が元のオブジェクトに影響を与えないことを意味します」です。ポインタは明らかにこれに違反しています。それ自体ではなく(他のポインターに害を与えずにポインターを簡単にコピーできるため)、それらが指すオブジェクトです。

于 2013-01-24T18:46:36.187 に答える
0

ここでの答えのほとんどは、「ポインター」と「ポインターが指すオブジェクト」を混同しています。ポインターには値のセマンティクスがあります。あるポインターを別のポインターにコピーすると、最初のポインターが変更され、2 番目のポインターは変更されません。

于 2013-01-24T15:52:59.400 に答える