[Bases C++ : 22] : objets Const et fonctions/méthodes membres const des classes, ainsi que problèmes courants impliquant const dans les classes !

Cette série d' articles liés au C++ est uniquement destinée aux notes d'étude de l'auteur, et j'utiliserai ma propre compréhension pour enregistrer l'étude ! La série d'apprentissage C++ sera divisée en trois étapes : bases, STL et structures de données et algorithmes avancés . Les contenus clés pertinents sont les suivants :

  1. Notions de base : Classes et Objets (impliquant les trois fonctionnalités majeures du C++, etc.) ;
  2. STL : Apprenez à utiliser les bibliothèques liées à la STL fournies par C++ ;
  3. Structures de données et algorithmes d'ordre élevé : implémentez manuellement votre propre bibliothèque STL et concevez et implémentez des structures de données d'ordre élevé , telles que l'arbre B, l'arbre B+, l'arbre rouge-noir, etc.

Ensemble d'étude :


Contenu de ce numéro : [Bases de C++ : 22] : variables/attributs membres const et fonctions/méthodes membres const des classes, ainsi que problèmes courants impliquant const dans les classes !


Contenu :
1. Compréhension de base des fonctions membres const
2. Questions à discuter avec des exemples de code : objets const des classes
- - 2.1 Analyse d'expression directe
- - 2.2 Combinée avec l'analyse de code
3. Comment écrire des fonctions membres const !
- - 3.1 Cadre d'écriture de base
- - 3.2 Modification d'exemples de codes d'erreur et résultats des tests
4. Problèmes courants impliquant const dans les classes !
5. Articles connexes recommandés


[ Lien vers la collection d'apprentissage C++ ]


1. Compréhension de base des fonctions membres const

  • Appelez la "fonction membre" modifiée par const une fonction membre const !

  • const modifie une fonction membre de classe et modifie en fait le pointeur this implicite dans la fonction membre, indiquant qu'aucun membre de la classe ne peut être modifié dans la fonction membre. (Pour comment comprendre, veuillez consulter le deuxième point d'analyse et l'utilisation réelle du troisième point)

Remarque : Il s'agit de *ce problème dans la classe mentionnée dans le contenu précédent : Cliquez pour accéder directement à l'article concerné


2. Exemples de code pour discuter des problèmes !

Lors de la lecture du code, n'oubliez pas la signification de la fonction membre const modifiée : la modification réelle du pointeur implicite this de la fonction membre indique qu'aucun membre de la classe ne peut être modifié dans la fonction membre.


Question : Le code suivant peut-il s'exécuter normalement ? [Analyse et discussion, regardez le contenu du texte après le code]

#include<iostream>
using std::cout;
using std::endl;

class Date {
public:
	Date(int year = 2000, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	void Print() {
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main() {
	// 此前学习的基本示例化方式
	Date d1(2023, 5, 23);

	// 使用 const 修饰实例化对象!
	const Date d2(2023, 5, 24);
	d1.Print();
	d2.Print();

	return 0;
}

résultat de l'opération :

Insérer la description de l'image ici


2.1 Analyse de l'expression directe

Comme le montre l'image : le programme signale une erreur ! Dans le code ci-dessus, la modification const est utilisée dans l'exemple d'instanciation ! Rappelez-vous ce qui a été mentionné dans l'introduction précédente aux classes : les classes réalisent l'identification de différents objets instances via "*ce pointeur" ! Le "*ce pointeur" que nous avons mentionné est le premier paramètre (caché) de la fonction membre de la classe ! Sa forme est : typename* const this !

/* 以构造函数为例 */
void Date( Date* const this, int year, int month, int day){]

Évidemment, nous pouvons savoir grâce au rapport d'erreur que l'objet d2 que nous utilisons est en fait modifié en const ! En d'autres termes, notre "*this pointeur" qui identifie d2 devrait également être modifié avec const ! Mais en revenant sur l'introduction précédente de "*this pointer" , nous avons mentionné que nous ne pouvons pas afficher l'émission et la réception de ce paramètre par défaut caché ! Alors comment résoudre ce problème ?


Solution : D'après l'introduction précédente : Quel est le rôle des fonctions membres const ?


2.2 Combiné avec l'analyse du code

Remarquez d’abord les deux objets instanciés ! (La différence littérale est de savoir s'il y a une modification const !)

// 使用 引用与指针的权限思路理解
Date d1(2023, 5, 23);			// 可读可写
const Date d2(2023, 5, 24);		// 只可读

Notez la fonction Print() : faites attention aux types de paramètres ! ! !

// 函数字面声明的原型如下:
void Print() {}
// 实际中编译器会翻译作:
void Print(Date* const this){}	

/* 
	简而言之,就是隐藏了 this 指针!
	且 this 指针是被 const 修饰(注意 const 在 * 之后的意义!!!)!
*/

Retour sur les deux objets instanciés eux-mêmes :

// 字面形式
Date d1(2023, 5, 23);			
const Date d2(2023, 5, 24);	

// 编译器翻译的形式:
Date d1(&d1, 2023, 5, 23);			
const Date d2(&d2, 2023, 5, 24);	

/*
	注意:
		&d1、&d2 是什么类型?
*/

Exécutez les instructions suivantes et obtenez les résultats !

/* 执行以下语句: */
cout << typeid(&d1).name() << endl;
cout << typeid(&d2).name() << endl;
/* 结果: */
class Date *
class Date const *

Insérer la description de l'image ici


En combinant les résultats ci-dessus et les types de paramètres de la fonction, nous pouvons voir le problème !

/*
	&d1:Date *
	&d2:Date const *
	函数参数:Date * 【 const 只是修饰指针的! 】
	从权限角度看来,函数接收的是可读可写参数,传递过来的是只读!在函数内使用时就是权限放大(不可行!只能平行或缩小!)
	
	由此:得出问题的关键就是在于参数问题!
	由此前知识点可知:类的默认隐含参数是不可以显示接收及传递的!那该如何使 Date * => Date const *
	解决方案:const 成员函数【 const 修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 】
*/

3. Comment écrire des fonctions membres const !

3.1 Cadre d'écriture de base

La méthode d’écriture de base est la suivante :

type function_name() const	/* 注意 const 的位置及作用 */
{
    
}

3.2 Modifier l'exemple de code d'erreur et tester les résultats

Modifiez la fonction Print() !

void Print() const	/* 注意此处修改! */
{
	cout << _year << "-" << _month << "-" << _day << endl;
}

Insérer la description de l'image ici


4. Problèmes courants impliquant const dans les classes !

  1. Un objet const peut-il appeler des fonctions non membres const ?
  2. Les objets non const peuvent-ils appeler des fonctions membres const ?
  3. Une fonction membre const peut-elle appeler d'autres fonctions membres non const ?
  4. D'autres fonctions membres const peuvent-elles être appelées dans une fonction non membre const ?
  5. Une fonction du même nom constitue-t-elle une surcharge avec ou sans modification const ?

Astuce : La pratique est le seul critère pour tester la vérité !


5. Articles connexes recommandés

1. Apprentissage C++ ::[Bases : 11] : Utilisation de base des classes C++ et des pointeurs this non statiques (deux points de test d'entretien) : Problèmes de pointeur nul des classes (ce pointeur peut-il être nul ?) | Où existe-t-il ce pointeur ?

Je suppose que tu aimes

Origine blog.csdn.net/weixin_53202576/article/details/131071535
conseillé
Classement