鱼C论坛

 找回密码
 立即注册

日志日志

热度 1已有 307 次阅读2014-2-13 09:54 |个人分类:鱼C日志

本文素材來自半真半不真的經歷。是關於程序的。我也來閑聊一下,以我的想法寫。
。。。
小軒軒:你的C++程序怎麼是void main?
小佳佳:書上寫的就是void main啦,不是嗎。。
小軒軒:不要那麽寫,據我所知,main函數只有一種返回類型,就是int,而且必須有返回值的。
小佳佳:就是要return 0;咯~
小軒軒:是啦。不過原來咱們學Java的時候,確實是public static void main的。
小佳佳:我們以前學過嗎?
小軒軒:好吧,就當沒有吧^_^ 其實我們C++裏面也應該是有分公有私有的函數的。我猜也得是public static的吧。
小佳佳:我不知道,聽起來好高端,哈哈。
小軒軒:我其實不太喜歡用那些別人的頭文件,但是沒辦法,现在的頭文件沒有想象中的那麽簡單。從我寫第一個頭文件stack.h以後,就感覺到,用自己寫的頭文件有一種奇妙的感覺哩。
小佳佳:是什麽呢?
小軒軒:是熟悉。我在用別人頭文件的時候有一種苦惱,就是不能完全匹配函數的變量。而自己要寫,就可以寫自己想要的,不合適就改,嘻嘻。
小軒軒:我們第一天學編程老師都喜歡獎講一個叫做Hello World的程序,就是這個啦。
 
#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h> _____
小佳佳:啊?
小軒軒:開玩笑啦。我們老師當然不會教這樣的程序啦。不過第一次接觸cout的時候,還真的有點接受不了。雖然學了文件流以後知道cout就是console output啦,可是“流”這個東西總讓人覺得有點不那麽直接 
小佳佳:反正我祇管#include <iostream> using namespace std; 然後就用了。
小軒軒:其實,小佳佳, 我現在覺得最好不要手懶寫
using namespace std; 的,因爲有些函數是在standard命名空間裏面,有些則不是,如果一貫用標準命名空間的話,就會match不到啦。。。所以我一貫也用std::cout等等啦。
小軒軒: 話説回來,我真的希望知道std::cout的實現。可是在iostream文件裏面祇是冷冰冰的寫著extern ostream cout; 繼續找會找到class basic_ostream,然後就暈了。於是我就寫了一個直接一點的
#ifndef OS_H
#define OS_H

#include <stdio.h>

namespace std{
class ostream{
public:
void flush() { if(stdout) fflush(stdout); }
const __cdecl ostream& operator << (int value) const;
const __cdecl ostream& operator << (char ch) const;
const __cdecl ostream& operator << (double value) const;
const __cdecl ostream& operator << (char const * str) const;
const __cdecl ostream& operator << (char * str) const;
const __cdecl ostream& operator << (void * p) const;
};
const __cdecl ostream& ostream::operator << (int value) const
{
printf("%d", value);
return *this;
}
const __cdecl ostream& ostream::operator << (char ch) const
{
printf("%c", ch);
return *this;
}
const __cdecl ostream& ostream::operator << (double value) const
{
printf("%g", value);
return *this;
}
const __cdecl ostream& ostream::operator << (char const * str) const
{
printf("%s", str);
return *this;
}
const __cdecl ostream& ostream::operator << (char * str) const
{
printf("%s", str);
return *this;
}
const __cdecl ostream& ostream::operator << (void * p) const
{
printf("0x%x", p);
return *this;
}
ostream cout;
ostream& __cdecl flush(ostream& i) {i.flush(); return(i);}
char const * endl = "\n";
}

#endif
小軒軒:於是我就可以#include "os.h"來輸出了。不過我寫的std::endl很水啦,就是一個"\n"的字符串常量。
小佳佳:這也可以。。。
小軒軒:我有時候啊,在網上給別人改程序,就會很不情願。看到他們各種不標準, 例如還出現iostream.h啦,就很明顯不好的習慣嘛。還有成員函數還不在構造函數初始化列表裏面聲明。我就會好生氣。
小佳佳:你幹嘛追求那麽標準?
小軒軒:其實是因爲我在學習的時候遇到好多system dependent的問題。vc7運行的好好的,vc6.0就不行。當然確實有標準庫的問題啦,比如std::size_t用的時候vc6.0偏說size_t is not a member of std。。。於是我索性打開vc6.0的<cstddef>頭文件自己寫上了
#ifndef _CSTDDEF_
#define _CSTDDEF_
#include <stddef.h>
namespace std {
using ::size_t;
}
#endif /* _CSTDDEF_ */

它立時不叫喚了。 
小佳佳:你一高興又説離話題了 
小軒軒:哈哈。有一個類的例子,我覺得特別好,雖然它做的只是簡單的工作,但是用的方法真的把我追求的純凈C++相符了。
#include <iostream>

class Sieve
{
public:
    virtual int NextNumber () = 0;
};

class SourceSieve: public Sieve
{
public:
    SourceSieve () : _i (2) {}
    int NextNumber ();
private:
    int _i;
};

class Sieve2: public Sieve
{
public:
    Sieve2 (Sieve & src) : _src (src) {}
    int NextNumber ();
private:
    Sieve & _src;
};

class Sieve3: public Sieve
{
public:
    Sieve3 (Sieve & src) : _src (src) {}
    int NextNumber ();
private:
    Sieve & _src;
};

class Sieve5: public Sieve
{
public:
    Sieve5 (Sieve & src) : _src (src) {}
    int NextNumber ();
private:
    Sieve & _src;
};

class Sieve7: public Sieve
{
public:
    Sieve7 (Sieve & src) : _src (src) {}
    int NextNumber ();
private:
    Sieve & _src;
};

int SourceSieve::NextNumber ()
{
    if (_i > 100)
        return -1; // end
    return _i++;
}

int Sieve2::NextNumber ()
{
    int i;
    do
    {
        i = _src.NextNumber ();
    } while (i % 2 == 0 && i != 2 && i != -1);
    return i;
}

int Sieve3::NextNumber ()
{
    int i;
    do
    {
        i = _src.NextNumber ();
    } while (i % 3 == 0 && i != 3 && i != -1);
    return i;
}

int Sieve5::NextNumber ()
{
    int i;
    do
    {
        i = _src.NextNumber ();
    } while (i % 5 == 0 && i != 5 && i != -1);
    return i;
}

int Sieve7::NextNumber ()
{
    int i;
    do
    {
        i = _src.NextNumber ();
    } while (i % 7 == 0 && i != 7 && i != -1);
    return i;
}

int main ()
{
    SourceSieve src;
    Sieve2 s2 (src);
    Sieve3 s3 (s2);
    Sieve5 s5 (s3);
    Sieve7 s7 (s5);
    int i;
    for (;;)
    {
        i = s7.NextNumber ();
        if (i == -1)
            break;
        std::cout << i <<" ";
    }    
}
小佳佳:你倒説説,相符在哪兒?
小軒軒:你看,很直接的使用了類的,而且一看就讓人明白純虛函數的作用。老師也講過eratosthenes的sieve方法,可是我仍然會覺得這個程序十分有趣。你看,他跟我的習慣一樣,都會把private成員的名字最前面加一個_,於是使用時就很方便。
小佳佳:哦,就是。我調試程序的時候,就會出現不能access的情況。這樣就好了。
小軒軒:所以啊,我覺得有些標準,是值得熱愛的。因爲我想,看我們代碼的人很可能是很可愛很可愛的小朋友,他/她很可能沒有使用我們在用的這個編譯器,要是ta及那個我們亂七八糟一串代碼粘進去,編譯不出來,豈不要變得不可愛啦…… 

路过

鸡蛋
1

鲜花

握手

雷人

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部