<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zu char*[SIZE]]]></title><description><![CDATA[<p>Hallo, in meinem Buch ist folgendes Beispiel:</p>
<p>Wäre es hier nicht besser static const string anstatt static const char* month_tbl zu verwenden.</p>
<p>char*[] ist doch ehr C oder täusche ich mich da?</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    // static const string wäre das nicht besser?
    static const char* month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

enum Month {
    jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dcm
};

//------------------------------------------------------------------------------

Month operator++(Month&amp; m)                       // prefix increment operator
{
    m = (m==dcm) ? jan : Month(m+1);             // &quot;wrap around&quot;
    return m;
}

//------------------------------------------------------------------------------

ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    // static const string wäre das nicht besser?
    static const char* month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}

//------------------------------------------------------------------------------

class Vector {};

//int operator+(int,int);        // error: you can't overload built-in +
Vector operator+(const Vector&amp;, const Vector &amp;); // ok
Vector operator+=(const Vector&amp;, int);           // ok

//------------------------------------------------------------------------------

int main()
{

    Month m = sep;
    ++m;                // m becomes oct
    ++m;                // m becomes nov
    ++m;                // m becomes dec
    ++m;                // m becomes jan (&quot;wrap around&quot;)
    cout &lt;&lt; m &lt;&lt; endl;

return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/307080/frage-zu-char-size</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 11:34:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307080.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Aug 2012 08:48:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 08:48:53 GMT]]></title><description><![CDATA[<p>Hallo, in meinem Buch ist folgendes Beispiel:</p>
<p>Wäre es hier nicht besser static const string anstatt static const char* month_tbl zu verwenden.</p>
<p>char*[] ist doch ehr C oder täusche ich mich da?</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    // static const string wäre das nicht besser?
    static const char* month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

enum Month {
    jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dcm
};

//------------------------------------------------------------------------------

Month operator++(Month&amp; m)                       // prefix increment operator
{
    m = (m==dcm) ? jan : Month(m+1);             // &quot;wrap around&quot;
    return m;
}

//------------------------------------------------------------------------------

ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    // static const string wäre das nicht besser?
    static const char* month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}

//------------------------------------------------------------------------------

class Vector {};

//int operator+(int,int);        // error: you can't overload built-in +
Vector operator+(const Vector&amp;, const Vector &amp;); // ok
Vector operator+=(const Vector&amp;, int);           // ok

//------------------------------------------------------------------------------

int main()
{

    Month m = sep;
    ++m;                // m becomes oct
    ++m;                // m becomes nov
    ++m;                // m becomes dec
    ++m;                // m becomes jan (&quot;wrap around&quot;)
    cout &lt;&lt; m &lt;&lt; endl;

return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2242327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242327</guid><dc:creator><![CDATA[ByteFeld]]></dc:creator><pubDate>Thu, 16 Aug 2012 08:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 08:52:04 GMT]]></title><description><![CDATA[<p>string hätte keinen Mehrwert, im Gegenteil. Also wozu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2242328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242328</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 16 Aug 2012 08:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 08:57:48 GMT]]></title><description><![CDATA[<p>Ab und zu sehe ich hier sowas:</p>
<pre><code class="language-cpp">char *str = &quot;abc&quot;;
cout&lt;&lt;str&lt;&lt;endl;
</code></pre>
<p>Und in den Antworten steht dann immer: Benutz lieber std::string<br />
Daher dachte ich das dass bei mir jetzt auch so ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2242330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242330</guid><dc:creator><![CDATA[ByteFeld]]></dc:creator><pubDate>Thu, 16 Aug 2012 08:57:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 09:30:50 GMT]]></title><description><![CDATA[<p>Vielleicht kommt hier gleich einer vorbei und schreibt aus Spaß &quot;Benutz lieber std::string&quot;. Machst du das dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2242345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242345</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 16 Aug 2012 09:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 09:33:08 GMT]]></title><description><![CDATA[<p>ByteFeld schrieb:</p>
<blockquote>
<p>Und in den Antworten steht dann immer: Benutz lieber std::string<br />
Daher dachte ich das dass bei mir jetzt auch so ist.</p>
</blockquote>
<p>Es ist ein großer Unterschied, ob du char*/string als <em>Variablen</em> oder <em>Konstanten</em> benutzt. Bei Konstanten brauchst du den ganzen Overhead von strings selten (in deinem Fall garnicht), bei Variablen dagegen häufig. Deshalb wird bei Variablen, an denen viele String-Operationen vorgenommen werden, immer davon abgeraten, C-Strings zu nehmen. In deinem Fall bringt die std::string Funktionalität aber keinen Mehrwert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2242347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242347</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Aug 2012 09:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu char*[SIZE] on Thu, 16 Aug 2012 15:05:21 GMT]]></title><description><![CDATA[<p>ByteFeld schrieb:</p>
<blockquote>
<p>Hallo, in meinem Buch ist folgendes Beispiel:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    // static const string wäre das nicht besser?
    static const char* month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}
</code></pre>
<p>Wäre es hier nicht besser static const string anstatt static const char* month_tbl zu verwenden.</p>
</blockquote>
<p>Nö. Die std::string-Objekte würden dann beim ersten Durchlauf initialisiert werden. Und bei dieser Initialisierung würde Heap-Speicher reserviert und die Zeichenketten aus dem constanten statischen Speicher in den Heap kopiert. Das ist aber überflüssig, wenn du die Zeichenketten eh nicht ändern willst. Ich würde dem Code nur noch ein extra &quot;const&quot; spendieren, damit das Array selbst konstant wird:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Month m)
{
    static const char* const month_tbl[12] = {
        &quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,
        &quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;
    };
    return os &lt;&lt; month_tbl[m-1];
}
</code></pre>
<p>ByteFeld schrieb:</p>
<blockquote>
<p>char*[] ist doch ehr C oder täusche ich mich da?</p>
</blockquote>
<p>In diesem Fall zeigen die Zeiger auf konstante Arrays im statischen Speicher. Das ist absolut kein Problem. Ein Problem wird es dann, wenn du zur Laufzeit die Zeichenketten ändern willst, so dass sie auf einen anderen String zeigen, den man sich zur Laufzeit zusammenbastelt. Dann hat man nämlich die manuelle Speicherverwaltung an der Backe, wo std::string viel praktischer gewesen wär.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2242532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2242532</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 16 Aug 2012 15:05:21 GMT</pubDate></item></channel></rss>