{"id":47,"date":"2008-04-16T20:22:32","date_gmt":"2008-04-16T19:22:32","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=47"},"modified":"2008-04-16T20:22:32","modified_gmt":"2008-04-16T19:22:32","slug":"c-fonctions-membres-constantes","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/04\/c-fonctions-membres-constantes\/","title":{"rendered":"C++ &#8211; Fonctions membres constantes"},"content":{"rendered":"<p>On d\u00e9clare une fonction membre constante en faisant suivre sa d\u00e9claration du mot-cl\u00e9 const.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">struct<\/span> S\r\n{\r\n  <span class=\"reservedname\">void<\/span> f(){}\r\n  <span class=\"reservedname\">void<\/span> f()<span class=\"reservedname\">const<\/span>{}\r\n}<\/pre>\n<p>La diff\u00e9rence entre les deux fonctions f() est que la version non-constante ne peut \u00eatre appel\u00e9e pour des objets constants de type S.<br \/>\nLa version constante de f() garantit aussi qu&rsquo;aucune donn\u00e9e membre de S ne sera modifi\u00e9e. Autrement dit vous ne pouvez modifier l&rsquo;objet de type S \u00e0 l&rsquo;int\u00e9rieur de la fonction.<\/p>\n<pre class=\"codesource\"><span class=\"reservedname\">struct<\/span> S\r\n{\r\n  S(){}\r\n  <span class=\"reservedname\">void<\/span> f(){}\r\n  <span class=\"reservedname\">void<\/span> f()<span class=\"reservedname\">const<\/span>{}\r\n  <span class=\"reservedname\">void<\/span> g(){}\r\n  <span class=\"reservedname\">void<\/span> h()<span class=\"reservedname\">const<\/span>{}\r\n};\r\n\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  S s;          <span class=\"codecomment\">\/\/ objet non-constant\r\n<\/span>  s.f();        <span class=\"codecomment\">\/\/ appelle la fonction non-constante\r\n<\/span>  s.g();\r\n  s.h();\r\n  \r\n  <span class=\"reservedname\">const<\/span> S cs;   <span class=\"codecomment\">\/\/ objet constant\r\n<\/span>  cs.f();       <span class=\"codecomment\">\/\/ appelle la fonction constante\r\n<\/span>  <span class=\"codecomment\">\/\/ cs.g();    \/\/ erreur! \r\n<\/span>  cs.h();\r\n\r\n  <span class=\"reservedname\">return<\/span> 0;\r\n}<\/pre>\n<p>Ceci montre bien que la fonction f() non-constante est appel\u00e9e pour un objet non-constant et qu&rsquo;\u00e0 l&rsquo;inverse, si l&rsquo;objet est constant, c&rsquo;est la fonction f() constante qui sera appel\u00e9e. cs.g() donne une erreur parce que cs \u00e9tant un objet constant, on ne peut appeler une fonction non constante pour un objet constant. Ce qui est logique puisque cs est de type S constant. On ne peut donc pas appeler une fonction de S qui modifierait l&rsquo;objet. Et justement, les fonctions membres constantes garantissent que l&rsquo;objet ne sera pas modifi\u00e9. Cons\u00e9quence, on ne peut appeler que des fonctions membres constantes pour des objets constants.<br \/>\nRemarquons aussi que s.h() est valide. Une fonction membre constante peut \u00eatre appel\u00e9e pour des objets constants aussi bien que non-constants.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On d\u00e9clare une fonction membre constante en faisant suivre sa d\u00e9claration du mot-cl\u00e9 const. struct S { void f(){} void f()const{} } La diff\u00e9rence entre les deux fonctions f() est que la version non-constante ne peut \u00eatre appel\u00e9e pour des objets constants de type S. La version constante de f() garantit aussi qu&rsquo;aucune donn\u00e9e membre [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/47"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=47"}],"version-history":[{"count":0,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/47\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=47"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=47"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=47"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}