免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
打印 上一主题 下一主题

[C++] 。。。。。。 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
11 [报告]
发表于 2012-08-08 17:45 |只看该作者
回复 4# gtkmm

编译器bug好玩。。。


1. gcc
T1, T2是不同类型:typedef int a[!is_same_type<T1,T2>::value? 1: -1];
但两个f不构成重载而是重定义:
void f(T1);
void f(T2);
因为gcc认为不同的calling convention算是不同类型,但mangling却不考虑calling convention。


2. msvc
__declspec(dllexport) void f(void) {}
__declspec(dllexport) void _imp__f(void) {}
编译为dll会导致编译器崩掉。
因为"symbol"会产生两个符号:"symbol"与"_imp__symbol"。
f产生的_imp__f与_imp__f产生的_imp__f冲突了。
叫你用前缀下划线,叫你用双下划线


3. vc6有一个volatile的
编译没问题,运行结果不符合预期。具体不记得了。


4. 不记得是哪个编译器了

  1. namespace tree { }
  2. struct tree {};
  3. int main()
  4. {
  5.       using tree;
  6. }
复制代码
好像是这样,要不就namespace与struct取其一。
同样会崩。
叫你用struct代替namespace,叫你用struct代替namespace

论坛徽章:
0
12 [报告]
发表于 2012-08-08 21:51 |只看该作者
本帖最后由 gtkmm 于 2012-08-08 21:52 编辑

1。太麻烦了, 某人都说了

2。
不能重载的主要是点, 也就是1. 2: 3... 4:: 这1到4个点

不继承和特殊的是赋值运算符
比如
class A{
public:
       A& operator=(B &b);
};
不被直接继承。


那个全重载是把所在的最内的那个名字空间里面都重载, 包括enum
比如你定义个复数模版类型complex, 你希望这样
complex<A> a;
complex<B> b1;
B b2;
希望 a+b1或a+b2的类型为complex<C>,  其中C是A+B的类型, 这里
可以把complex单独放一个名字空间, 使用全重载。



去他妹的,不打字了,Ipad根本不是用来上网的, 垃圾键盘真难用

论坛徽章:
0
13 [报告]
发表于 2012-08-08 22:04 |只看该作者
OwnWaterloo 发表于 2012-08-08 17:45
回复 4# gtkmm

编译器bug好玩。。。



4。 gcc就这样的, 比如我的4.5
别的没见过, 那个volatile在nvcc里很有意思




论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
14 [报告]
发表于 2012-08-09 10:20 |只看该作者
楼主可以换个方式问问:

各位大牛在工作中都采用了c++的哪些特性?

论坛徽章:
0
15 [报告]
发表于 2012-08-09 11:20 |只看该作者
留名。hello, world.

论坛徽章:
0
16 [报告]
发表于 2012-08-09 14:40 |只看该作者
学生来回答一下,
不免错误,有遗漏,请大家指正。

Q:1.  基本类型:        各种类型是怎么进行默认转换的, ( )强制转换和各种cast都有什么区别,  编译器如何对齐, pack和align是什么东西

A:对于常见类型,分为两类
short ,int ,long ,位数长的转化为短的,会产生截断。反之,会填充。
double ,float,规则如上。
浮点转化为非浮点之间,一般情况有精度损失,非浮点转化为浮点,一般情况不会有问题。

强制转换是c、c++语言共有的,
各种cast是c++为了替代强制转换,引入的标记符。

编译器对齐:32位,就是4字节对齐
pack 常见于struct 对齐,默认情况下 ,结构体是struct是 pack大小的整数倍。(pack一般取偶数)(linux os,32bit)
align (?没用过)

---------------------------------------

Q2. 运算符:所有运算符的优化级都弄明白了么?  
A:优先级表不好记,查了书,看看吧:
下面是C语言中所使用的运算符的优先级和结合性:
     优先级         运算符                结合性
     (最高)        () [] -> .            自左向右
             ! ~ ++ -- + - * & sizeof    自右向左
                    * / %                自左向右
                     + -                 自左向右
                    >                自左向右
                   >=              自左向右
                    == !=                自左向右
                     &                   自左向右
                     ^                   自左向右
                     |                   自左向右
                     &&                  自左向右
                     ||                  自左向右
                     ?:                  自右向左


       = += -= *= /= %= &= ^= |= >= 自右向左
          
          
Q什么能重载,什么不能重载, 什么能运算符不会自动继承交类?
A:翻了下谭爷爷的书:
不能重载的有5个
.(成员) *(指针) ::(位域) sizeof(长度)?:(条件)
至于运算符不能继承于基类:我认为运算符不是虚函数(?)

                           
Q:template<typename A, typename B> operator+(const A&, const B&);
这样的全通用运算符重载, 会能重载哪些类型?
A:
没有重载和模版一起使用的经验,猜一下吧,
看起来这个运算符可以实现不同类的运算,
不过这个重载没有返回值,不懂,求解释



---------------------------------------
3. class:               

Q:虚函数表是怎么回事?
A:c++对象虚函数指针存储的table,用于实现多态

Q:this指针存在object的哪个位置?  
A:我认为this指针就是object在内存的起始位置

Q:多继承是怎么实现的?
A:钻石继承的话,中间2个类使用父类指针,减少存储父类的冗余。
另外一个角度说,虚表实现。


---------------------------------------
4. stl:                    
Q:是否知道stl里所有容器的各种操作效率和占用空间大小?
Q:stl里的算法可否精通?
Q:删除一个容器里符合某个条件的元素,怎么实现?

A:

关于stl容器效率、空间:待补充
stl中,find用得多点
删除元素时,要记着迭代器失效。删除时:先找到这个元素,再删除呗。//O(∩_∩)O~


---------------------------------------
5. iostream:      
这东西搞明白么?   
各种格式操作符都会用么?  
自己会扩展格式操作符么?  
如何给一个tcp描述符用上iostream?

A:
iostream就是用来替代stdio
格式操作符,sprintf之类,//windows上开发,还会遇到宽字符问题



---------------------------------------
6. template:      
Q:模块玩明白了么?  
能否实现这个宏:bop_type(A, op , B), 这个宏会得到A与B运算的类型,
比如:  bop_type(int, +, double)会得到double

A:不明白

---------------------------------------
7. type traits:
Q:如何在编译时判断类型A是否是一个class,
如何判断A是否继承B?
如何判断A是否是一个整形?

A:
判断类,static_cast
判断继承,用dynamic_cast
判断整形,用type_id



---------------------------------------
8. c++11:  
lamda玩得转么?  
tuple类是怎么实现的?  
知道有变长模版参数列表么, 用这个实现个printf如何?   
shared_ptr, weak_ptr这些东西怎么用,怎么实现的?

A:lamda、tuple类、变长模版参数、weak_ptr不懂,
变长参数链表就是3个宏,一个用于指向输出的格式化字符串的头部,一个用来做游标,一个指向末尾。
对于c++有个类似的模版,没用过。
对于shared_ptr,他就是个智能指针,能够引用计数,方便资源管理。


---------------------------------------
9. boost:           enable_if怎么实现的, 什么原理?
A:没有玩过
---------------------------------------
10. compiler:    你发现了几个编译器bug?
A:nothing ,
同样的代码运行于gcc ,cl,输出几个不同就让我惊喜相加,仰望这个境界啊
---------------------------------------


论坛徽章:
0
17 [报告]
发表于 2012-08-09 22:58 |只看该作者
我觉得我自己 只掌握了22%  

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
18 [报告]
发表于 2012-08-09 23:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2012-08-11 02:39 |只看该作者
回复 16# titer1
* 不能重载,那些智能指针怎么混啊
$ cat ptr.cc && $CXX -o ptr ptr.cc && ./ptr
  1. #include <iostream>

  2. struct ptr
  3. {
  4.     void operator * () const
  5.     {
  6.         std::cout << "operator * called.\n";
  7.     }
  8. };

  9. int main()
  10. {
  11.     ptr p;
  12.     *p;
  13.     return 0;
  14. }
复制代码
operator * called.


   

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
20 [报告]
发表于 2012-08-11 18:46 |只看该作者
本帖最后由 __BlueGuy__ 于 2012-08-11 19:29 编辑

我只掌握了 5%,  但足以够用了, !
提醒大家一句,c++ 兼容 c ,使用 c++ 的时候可以不会 c++

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP