Site Tools


const

константные переменные

  const int intVal = 7;
  int const intVal2 = 8;

Оба варианта правильные и не отличаются.

константное поле данных класса

инициализируется списком инициализаций

class B
{
  const int constValue;
public:
  B(int&);
};

B::B(int& intIn)
:constValue(intIn)
{}

константный метод

не имеет права изменять переменные класса (параметры).

class Test
{
  int someInt;
public:
  void func()const;
}

void Test::func()const{
  someInt = 2 // !!! ERROR
}

совмещение вызова разных методов и константных методов

  • в не константных методах можно вызывать не константные и константные методы
  • в константных методах можно вызывать только константные методы. В случае же необходимости такого вызова, придется использовать адаптер (приведен ниже) или const_cast(приведен ниже).

Эти свойства, диктуют необходимость указывать const везде, где это возможно, в случае, если вашим кодом будут пользоваться другие люди. Тогда им не придется мучиться с преобразованием ваших “псевдо не констанктных” методов.

#include <iostream>
#include <string>
using namespace std;
	
class libraryClass{
public:
	void testString(){
		cout << "libraryClass::testString" << endl;
	}
	void constTestString()const{
		cout << "libraryClass::constTestString" << endl;
	}
};
	
class MyClass : public libraryClass{
public:
	void callTest(){
		cout << "MyClass::callTest" << endl;
		testString();
		constTestString();
	}
	void constCallTest()const{
		cout << "MyClass::constCallTest" << endl;
		// testString(); // ERROR: error C2662: libraryClass::testString: невозможно преобразовать указатель 'this' из 'const MyClass' в 'libraryClass &' В результате преобразования теряются квалификаторы
		constTestString();
	}
};
      
int main(){
	MyClass obj;
	
	obj.callTest();
	cout << "--------" << endl;
	obj.constCallTest();
}

вывод

MyClass::callTest
libraryClass::testString
libraryClass::constTestString
--------
MyClass::constCallTest
libraryClass::constTestString
решение с использованием адаптер объекта
#include <iostream>
#include <string>
using namespace std;

class libraryClass{
public:
	void testString(){
		cout << "libraryClass::testString" << endl;
	}
	void constTestString()const{
		cout << "libraryClass::constTestString" << endl;
	}
};

class LibraryAdapter
{
public:
	void testString() const {objLibr.testString();}
	void constTestString()const{objLibr.constTestString();}
private:
	mutable libraryClass objLibr;
};

class MyClass : public LibraryAdapter{
public:
	void callTest(){
		cout << "MyClass::callTest" << endl;
		testString();
		constTestString();
	}
	void constCallTest()const{
		cout << "MyClass::constCallTest" << endl;
		testString();
		constTestString();
	}
};

int main(){
	MyClass obj;

	obj.callTest();
	cout << "--------" << endl;
	obj.constCallTest();

	string endString;
	cin >> endString;
}

вывод

MyClass::callTest
libraryClass::testString
libraryClass::constTestString
--------
MyClass::constCallTest
libraryClass::testString
libraryClass::constTestString
решение с использованием const_cast
#include <iostream>
#include <string>
using namespace std;

class libraryClass{
public:
	void testString(){
		cout << "libraryClass::testString" << endl;
	}
	void constTestString()const{
		cout << "libraryClass::constTestString" << endl;
	}
};

class MyClass : public libraryClass{
public:
	void callTest(){
		cout << "MyClass::callTest" << endl;
		testString();
		constTestString();
	}
	void constCallTest()const{
		cout << "MyClass::constCallTest" << endl;
		const_cast<MyClass*>(this)->libraryClass::testString();
		constTestString();
	}
};

int main(){
	MyClass obj;

	obj.callTest();
	cout << "--------" << endl;
	obj.constCallTest();

	string endString;
	cin >> endString;
}

вывод

MyClass::callTest
libraryClass::testString
libraryClass::constTestString
--------
MyClass::constCallTest
libraryClass::testString
libraryClass::constTestString

Константный объект

  • Если объект инициализируется как константный, то он может вызывать _только_ константные методы.
  • Конструкторы и деструкторы не могут быть констактными и им сделано исключение из выше упомянутого правила.
#include <iostream>
#include <string>
using namespace std;

class libraryClass{
public:
	void testString(){
		cout << "libraryClass::testString" << endl;
	}
	void constTestString()const{
		cout << "libraryClass::constTestString" << endl;
	}
};

class MyClass : public libraryClass{
public:
MyClass(){cout << "MyClass::MyClass()" << endl;}
	void callTest(){
		cout << "MyClass::callTest" << endl;
		testString();
		constTestString();
	}
	void constCallTest()const{
		cout << "MyClass::constCallTest" << endl;
		const_cast<MyClass*>(this)->libraryClass::testString();
		constTestString();
	}
};

int main(){
	const MyClass obj;

	//obj.callTest(); //ERROR: C2662: MyClass::callTest: невозможно преобразовать указатель 'this' из 'const MyClass' в 'MyClass &'
	obj.constCallTest();
}

вывод

MyClass::MyClass()
MyClass::constCallTest
libraryClass::testString
libraryClass::constTestString

констактный объект

После инициализации объекта, его изменение не допустимо.

const MyClass obj(someArg);

константа и указатель

const int* ptrInt // Указатель на константу (не изменяем значение по адресу ptrInt)
int const* ptrInt // Указатель на константу (не изменяем значение по адресу ptrInt)
int* const ptrInt // Константный указатель (не изменяем значение адреса ptrInt)

const int* const ptrInt //Константный указатель на константу

константные аргументы

не позволяет изменять данные аргументов

int method(const string str, const Myclass &objIn)
You could leave a comment if you were logged in.
const.txt · Last modified: 2013/04/11 03:37 by konovalov

Page Tools