C++におけるconst使用概要
1.変数を修飾するために使用され、その変数が初期化された後に変更できないことを示す
テストコード:
プログラムのコンパイル中にエラーが発生します.error C 3892:'value':you cannot assign to a variable that is constはconstタイプの変数を変更できません.
2.ポインタを修飾する
pはconstで修飾されているので、pの値は変更できません.pに値を再割り当てすると、エラーが表示されます.しかし、pが指すオブジェクトは変更できます.上記のコードではvalue 1の値を変更できます.Const int*pではconst修飾はポインタpが指すオブジェクトであり,ポインタpは他のメモリ空間を指すことができるが,pによってpが指すオブジェクトの値を修正することはできないことを示す.
ここで出力内容は20であり、pがvalue 2を指すことを示す.
コードを次のように変更すると
しかし、ここではvalue 1が変更できないことを示すものではなく、value 1=30などのvalue 1を直接割り当てることができます.ポインタpでpが指す内容を修正することはできないというだけです.ここでプログラムコンパイルは、pが指すオブジェクトが定数であるため、pによってpが指すオブジェクトを修正することはできません.いったん修正すると、間違いを報告します.
3.constの関数における修飾作用
ポインタタイプパラメータ:
ここでsrcは入力パラメータ,destは出力パラメータである.srcにconst修飾を加えると、srポインタで指向するメモリ空間を修正したり、データを保護したりして、修正されないようにすることはできません.
基本タイプの値伝達パラメータ:パラメータが値伝達の場合、パラメータはコピーにすぎず、元のデータを変更していないため、constで修飾する必要はありません.カスタムオブジェクトのリファレンス伝達パラメータ:パラメータがカスタムオブジェクトであれば、値伝達効率が低く、効率を向上させるためにリファレンスの方法を採用することが多いが、リファレンスによってオブジェクトの内容を変更するのではなく、リファレンスの前にconst修飾を加えることもできる.次のようになります.
関数の戻り値の説明
このコードのコンパイルにエラーが発生します.
G:\sourceCode\constTest\constTest\main.cpp|16|error: invalid conversion from 'const char*' to 'char*'|
const char*p=getContent();意味は上と重複していますが、使う場合は違います.
constメンバー関数:
関数の後にconst宣言を追加します.これは、クラス内の属性メンバーの値を変更できないことを示します.うっかり修正したら、コンパイルが間違っています.
テストコード:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
const int value = 10;
value = 30; //value
return 0;
}
プログラムのコンパイル中にエラーが発生します.error C 3892:'value':you cannot assign to a variable that is constはconstタイプの変数を変更できません.
2.ポインタを修飾する
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int value1 = 10;
int value2 = 20;
// const p, p ,
int * const p = &value1;
p = &value2; //
cout<<*p<<endl;
getchar();
return 0;
}
pはconstで修飾されているので、pの値は変更できません.pに値を再割り当てすると、エラーが表示されます.しかし、pが指すオブジェクトは変更できます.上記のコードではvalue 1の値を変更できます.Const int*pではconst修飾はポインタpが指すオブジェクトであり,ポインタpは他のメモリ空間を指すことができるが,pによってpが指すオブジェクトの値を修正することはできないことを示す.
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int value1 = 10;
int value2 = 20;
// const p, p
const int *p = &value1;
p = &value2;
cout<<*p<<endl;
getchar();
return 0;
}
ここで出力内容は20であり、pがvalue 2を指すことを示す.
コードを次のように変更すると
const int *p = &value1;
*p = 30;
しかし、ここではvalue 1が変更できないことを示すものではなく、value 1=30などのvalue 1を直接割り当てることができます.ポインタpでpが指す内容を修正することはできないというだけです.ここでプログラムコンパイルは、pが指すオブジェクトが定数であるため、pによってpが指すオブジェクトを修正することはできません.いったん修正すると、間違いを報告します.
3.constの関数における修飾作用
ポインタタイプパラメータ:
void Dataopy(char *dest, const char *src);
ここでsrcは入力パラメータ,destは出力パラメータである.srcにconst修飾を加えると、srポインタで指向するメモリ空間を修正したり、データを保護したりして、修正されないようにすることはできません.
基本タイプの値伝達パラメータ:パラメータが値伝達の場合、パラメータはコピーにすぎず、元のデータを変更していないため、constで修飾する必要はありません.カスタムオブジェクトのリファレンス伝達パラメータ:パラメータがカスタムオブジェクトであれば、値伝達効率が低く、効率を向上させるためにリファレンスの方法を採用することが多いが、リファレンスによってオブジェクトの内容を変更するのではなく、リファレンスの前にconst修飾を加えることもできる.次のようになります.
Session& operator=(const Session &session);
ベーシックタイプでも使えますのでOKです.関数の戻り値の説明
const char* getContent()
{
char* p = new char[20];
char szContent[] = "This is my Test";
memset(p, 0, 20);
memcpy(p, szContent, 15);
return p;
}
int main()
{
char* p = getContent();
cout<<p<<endl;
return 0;
}
このコードのコンパイルにエラーが発生します.
G:\sourceCode\constTest\constTest\main.cpp|16|error: invalid conversion from 'const char*' to 'char*'|
const char*p=getContent();意味は上と重複していますが、使う場合は違います.
constメンバー関数:
Socket getSock()const;
関数の後にconst宣言を追加します.これは、クラス内の属性メンバーの値を変更できないことを示します.うっかり修正したら、コンパイルが間違っています.