回 帖 发 新 帖 刷新版面

主题:C++的一些FAQ

Bjarne Stroustrup对一些常见问题的答复,不一定因为是Bjarne Stroustrup说的就怎么怎么样,不过毕竟他是个很有水平的

原文的地址为:http://www.research.att.com/~bs/bs_faq.html
[建议E文好的看E文的,我最开始没找到翻译的,就是自己对着金山词霸慢慢看的,不过看了些就放弃了...大家不要学我]

中文的从网上发现的,翻译为左轻侯,这里只是一部分的问题

问题                                        楼层
我如何写个非常简单的程序?                  1
为什么一个空类的大小不为 0?                2
为什么析构函数默认不是 virtual 的?         3
为什么不能有虚拟构造函数?                   4
我能够在构造函数中调用一个虚拟函数吗?      5 
为什么重载在继承类中不工作?                6
怎样将一个整型值转换为一个字符串?          7
我应该将“const”放在类型之前还是之后?     8
“int* p”正确还是“int *p”正确?          9
为什么 delete 不会将操作数置 0?            10
我能够写“void main()”吗?                 11
我如何定义一个类内部(in-class)的常量?    12
我为什么必须使用一个造型来转换*void?       13
有没有“指定位置删除”(placement delete)?  14
为什么编译要花这么长的时间?                15
我必须在类声明处赋予数据吗?                16
我能防止别人继承我自己的类吗?              17
为什么不能为模板参数定义约束(constraints)?18
什么是函数对象(function object)?         19
我应该如何对付内存泄漏?                    20
我为什么在捕获一个异常之后就不能继续?      21
怎样从输入中读取一个字符串?                22
为什么 C++不提供“finally”的构造?         23
为什么我不能重载点符号,::,sizeof,等等?  24 
使用宏有什么问题?                          25



如果大家感觉好,希望顶一顶,多让些学习C++的朋友们都学习学习. [em2]

加油.!~~~~~~~~~~~~~~~~~ 同志们!

回复列表 (共61个回复)

51 楼

我也是学c++的啊
好东西啊

52 楼

格子辛苦 !

53 楼

见识了!

54 楼

[quote]这图是一白领.蛮喜欢的[/quote]

[code]
[color=FF00FF]
请问格子学习LINUX 学得怎样 ?
AND 
FVWM 用得怎样,可不可以发一scrennshot 上来呀!

I am a linuxfans /

[/color]

[/code]

55 楼

[code]

[color=FF00FF]

FVWM 让我既让我高兴,又让我哭笑不得!

真佩服"王垠", 真正的LINUX 高手!
还有LINUS!
[/color]
[/code]

56 楼

[img]http://www.ediwon.com/upload/shot1.png[/img]

见笑了,那我就贴出来了。

http://upload.programfan.com/upfile/200610150030613.rar

(因为上传不支持tar.gz后辍名,所以我把后辍名改rar上传了。所以请下载的朋友把文件
200610150030613.rar下载到本地后改名为fvwm.tar.gz,再解压到自己/root/目录下。)

请记得,如果你~/.fvwm/目录下有.fvwm2rc文件请删除掉。(或者改名)
因为我配置文件名为config, fvwm读取顺序是先读config再读.fvwm2rc文件的。
全部代码都是自己一个字符一个字符输入进去的...原创

有哪里不理解的可以发mail给我。 

janlex[at]msn.com

57 楼

http://www.ediwon.com/upload/shot1.png

这是图的地址,用IE打开,,是大图..

58 楼


多谢楼主,早就想找那个Bjarne Stroustup的论坛了,很好,过后大有帮助.

59 楼

60 楼

#include <iostream>
#include <cstdlib>
#include <cctype>
#include <string>

class Error {};

class Calculator
{
    int pos;
    std::string expr;
    int addsubt();
    int multdiv();   
    int number() throw(Error);

public:
    Calculator(){}
    int Compute(const std::string& str) throw(Error);
};
int Calculator::Compute(const std::string& str) throw(Error)
{
    int rtn=0;
try
{
    pos=0;
    expr=str;
    rtn=addsubt();
    if (pos<expr.length() && expr[pos]!='\0')
        throw Error();
}
catch(Error)
{
    std::cout<<' \r';
    while (pos--)
        std::cout<<' ';
    std::cout<<"^ syntax error"<<std::endl<<'\a';
    throw;
}
return 0;
}
int Calculator::addsubt()
{   int qu=1;
    int rtn=multdiv();
    while (expr[pos]=='+' || expr[pos]=='-')
    {
        int op=expr[pos++];
        int opr2=multdiv();
        if(op=='+')
            rtn+=opr2;
        else
            rtn-=opr2;
    }
    if(!expr[pos])
        std::cout<<rtn<<std::endl;
    return rtn;
}
int Calculator::multdiv()
{
    int rtn=number();
    while (expr[pos]=='*' || expr[pos]=='/')
    {
        int op=expr[pos++];
        int opr2=number();
        if(op=='*')
            rtn*=opr2;
        else
            rtn/=opr2;
    }

    return rtn;
}
int Calculator::number() throw(Error)
{
    int rtn;
    if(expr[pos]=='(')
    {
        pos++;
        rtn=addsubt();
        if(expr[pos++]!=')')
            throw Error();
    }
    else
    {
        if(!isdigit(expr[pos]))
            throw Error();
        char ans[80]= "0";
        int i=0;
        while ( isdigit(expr[pos]) && pos<expr.length())
            ans[i++]=expr[pos++];
        ans[i]='\0';
        rtn=atoi(ans);
    }
    
    return rtn;
}
int main()
{  
    int ans;
    
    do
    {
        std::cout<<"Enter expression (o to quit):"<<std::endl;
        std::string expr;
        std::cin>>expr;
        try
        {
            Calculator calc;
            ans=calc.Compute(expr);
        
            if(ans != 0)
                std::cout<< ans <<std::endl;
        }
        catch(Error)
        {
            std::cout<<"Try again"<<std::endl;
            ans=1;
        }
    }
    while(ans != 0);


 return 0;
}
C++显式地允许delete操作将操作数左值置 0,而且我曾经希望C++的实现能够做到这一
点,但这种思想看来并没有在C++的实现中变得流行。 
这是个运算器

我来回复

您尚未登录,请登录后再回复。点此登录或注册