+ -
当前位置:首页 → 问答吧 → C++问题 希望有高手可以指教一下

C++问题 希望有高手可以指教一下

时间:2014-05-19

来源:互联网

Hello大家好, 我岩岩学紧c++ , 之前只学过极小少javascript 伪代码 html 同少量mysql
最近岩岩dse完, 希望研究下c++, 之后学vb then Java,
我系根据http://openhome.cc/Gossip/CppGossip/ 学习, 呢个网几岩我思维,
但去到中间, 有d概念唔明, 所以希望可以放上黎, 大家讨论一下, 指教小弟
复制内容到剪贴板代码:#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
int iarr[] = {30, 12, 55, 31, 98, 11, 41, 80, 66, 21};
vector<int> ivector(iarr, iarr + 10);

// 排序
sort(ivector.begin(), ivector.end());

for(vector<int>::iterator it = ivector.begin();
it != ivector.end();
it++) {

cout << *it << " ";
}
cout << endl;

cout << "输入搜寻值:";
int search = 0;
cin >> search;

vector<int>::iterator it =
find(ivector.begin(), ivector.end(), search);

if(it != ivector.end()) {
cout << "找到搜寻值!" << endl;
}
else {
cout << "找不到搜寻值!" << endl;
}

// 反转
reverse(ivector.begin(), ivector.end());

for(vector<int>::iterator it = ivector.begin();
it != ivector.end();
it++) {

cout << *it << " ";
}
cout << endl;

return 0;
}
以上面为例,

请问

1)using namespace std;
呢旧野系讲左D咩?同Include 一个library又有咩分别?

2)vector<int> ivector(iarr, iarr + 10)
平时vecotor<int>ivector(10,5) 系指呢个vecotor有十旧野, 初始值系5, 但系(iarr, iarr + 10) 系唔系指紧佢既范围?
系既+10系唔系指去到array入面第九个物件?

3)for(vector<int>::iterator it = ivector.begin();
当中"::"系有咩意思? iterator it又系有咩用? 事关我再iterator it做一个指令, run果时run唔到
::iterator it 实际有咩用?

4)cout << *it << " "; 当中*it 同 it 有咩分别?

5)点解我cout唔到 ivector.begin()?

6) 到底Object-Oriented programming 实体系指咩? 佢系一个concept / function?
以我理解, 佢应该系一个concept, 将一旧大旧既野, 变做一小忽一小忽 同埋一个interface比呢d 一小忽一小忽插入去, 就好似apple iphone, 佢唔比你换电池, 当电池坏左就要成部手机拎番去整, 唔同samsung, 佢可以换电, 坏左电就只系整电就ok, 我理解有错吗?


新仔问题多, 希望各位多多包容

[ 本帖最后由 懒羊x 於 2014-4-22 02:50 AM 编辑 ]

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 02:31 AM 发表
Hello大家好, 我岩岩学紧c++ , 之前只学过极小少javascript 伪代码 html 同少量mysql
最近岩岩dse完, 希望研究下c++, 之后学vb then Java,
我系根据http://openhome.cc/Gossip/CppGossip/ 学习, 呢个网几岩我思维, ...
你6条问题,我唔答哂,答3条先
1. using namespace std; 即系用std 呢个namespace
include同namespace concept 上有D唔同
include系include个file,而using namespace 系喺你一堆include左既files入面,用特定一个namespace。

4. 系呢个case, it系一个pointer,*it系个object

6.可以讲Object-Oriented programming系一个conept
佢将一组 functions(methods)同variables(attributes) group理一齐个一个object
好简单既例子系string object.string object除左嗰串字外,仲有一组 functions(methods)处理呢串字。

作者: McLoneIII   发布时间: 2014-05-19

明白....所以话include一个file, using呢个file其中一组functions, am i right?

但pointer系有咩用? 姐系好似temp咁? 一个暂存既variables?

多谢你OOP既见解, oop就姐系好似我地中学学既 f(x)咁. 一条functions, 当input x就会出y 而一个programme就由多个functions组成

作者: 懒羊x   发布时间: 2014-05-19

iterator 不是pointer
iterator 只是一个行为上跟pointer一样的东西

这是C++嘅特色

作者: Susan﹏汪汪   发布时间: 2014-05-19

你有以上问题,反映:
1. 你有心学习;
2. 网上学习(尤其单一网站)只提供表面应用,并无详细讲解概念及原理。

第 1 点,㳟喜你,你有望学习成功!
第 2 点,如你一定要网上学习,咁你就要识得将你嘅问题,利用搜寻器去搵所需答案,此为不可避免。
如果你觉得麻烦,又或唔知搵乜,我强烈建议你睇书学。
图书馆内有好多学习 C++ 嘅书,新版讲 C++/11 标准都有,借嚟睇,省钱省时间。
拣书建议英文版,英文真系唔得就选中译版。千万唔好拣作者系内地或台湾人写嘅中文书,因为良莠不齐,好多作者连概念都错。
边本好?上 amazon 睇推介。

作者: fitcat07   发布时间: 2014-05-19

引用:原帖由 fitcat07 於 2014-4-22 03:35 PM 发表
你有以上问题,反映:
1. 你有心学习;
2. 网上学习(尤其单一网站)只提供表面应用,并无详细讲解概念及原理。

第 1 点,㳟喜你,你有望学习成功!
第 2 点,如你一定要网上学习,咁你就要 ...
汪汪只睇过一次呢本

程式揭秘从c c++程式码探索电脑系统的运作原理

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 12:25 PM 发表
明白....所以话include一个file, using呢个file其中一组functions, am i right?

但pointer系有咩用? 姐系好似temp咁? 一个暂存既variables?

多谢你OOP既见解, oop就姐系好似我地中学学既 f(x)咁. 一条functions, 当input x就会出y 而一个programme就由多个functions组成.
明白....所以话include一个file, using呢个file其中一组functions, am i right?
差唔多,但唔系一组functions,而系一组classes

但pointer系有咩用? 姐系好似temp咁? 一个暂存既variables?
我打个比喻,我有个10MB既文件,如果我想俾人睇及俾人修改,我下下要send个10MB文件俾人,会好浪费资源及时间。
所以我将呢个文件放系一个地方,然后只系俾个link俾人,人地可以去睇及修改,咁我唔洗下下send 10MB野俾人。
pointer就好似呢个link。

oop就姐系好似我地中学学既 f(x)咁. 一条functions, 当input x就会出y 而一个programme就由多个functions组成.
有D唔正确,数学既f(x)似functional programming,而唔系OOP。
OOP好似将一组 functions同variables 组成一个object/class。

作者: McLoneIII   发布时间: 2014-05-19

在C++中...

编译一个程式分为三个阶段

预处理
编译成中间码
编译成机器码


在第一阶段的预处理...所指的系macro处理
C++中所有以#开头的指令都系macro...macro并不是C++语言的一部分
只系一种"用来自动产生程式码的程式语言"...所以macro系另一套语言

例如
复制内容到剪贴板代码:#define MY_INT int

int main()
{
MY_INT my_var = 0;

return 0;
}
在"预处理"阶段中...其实系做符号替换
即系#define MY_INT int代表把所有之后出现MY_INT的地方都换成int
所以在编译器眼中...真正的原始码系咁
复制内容到剪贴板代码:int main()
{
int my_var = 0;

return 0;
}
另一例
复制内容到剪贴板代码:#define MIN(a, b) ((a) < (b) ? (a) : (b))

int main()
{
int my_var = MIN(5, 2);

return 0;
}
会自动替换成
复制内容到剪贴板代码:int main()
{
int my_var = ((5) < (2) ? (5) : (2));

return 0;
}
所以....所谓的#include
原理都只系咁
test.h
复制内容到剪贴板代码:int foo()
{
return 5;
}
test.cpp
复制内容到剪贴板代码:#include "test.h"

int main()
{
int my_var = foo();

return 0;
}
test.cpp这档案会自动替换成
复制内容到剪贴板代码:int foo()
{
return 5;
}

int main()
{
int my_var = foo();

return 0;
}
即系把test.h的内容都填充在#include的位置

作者: Susan﹏汪汪   发布时间: 2014-05-19

而namespace系程式码的定义范围
复制内容到剪贴板代码:// test.h

namespace test
{
int foo()
{
return 0;
}
}
这里我们先定义了foo()...不过在namespace test的范围内

如果我们不预先指定使用namespace
复制内容到剪贴板代码:// test.cpp
#include "test.h"

int main()
{
int my_var = foo(); //error: foo() is not defined
return 0;
}
因为对编谓器来讲....在广域上没有定义foo()
所以就找不到foo()这function

但如果事先指定了using namespace test
复制内容到剪贴板代码:// test.cpp
#include "test.h"
using namespace test;

int main()
{
int my_var = foo(); //ok!!!
return 0;
}
那么编译器就知道...之后的程式码除了寻找广域上的定义外....还要寻找namespace test内的定义

但namespace的使用并非只有这方式
可以系咁
复制内容到剪贴板代码:// test.cpp
#include "test.h"

int main()
{
int my_var = test::foo(); //直接指定使用namespace test内的foo()定义
return 0;
}
复制内容到剪贴板代码:// test.cpp
#include "test.h"

int main()
{
using namespace test; //只在main内使用namespace test
int my_var = foo();
return 0;
}

作者: Susan﹏汪汪   发布时间: 2014-05-19

如果再讲多D Macro的事
macro系一把双刃刀

例如
复制内容到剪贴板代码:#define MIN(a, b) ((a) < (b) ? (a) : (b))

int main()
{
int my_var = MIN(5, 2);

return 0;
}
因为会自动替换成
复制内容到剪贴板代码:int main()
{
int my_var = ((5) < (2) ? (5) : (2));

return 0;
}
像((5) < (2) ? (5) : (2))这种全部系常数的东西...编译器系可以直接改成
复制内容到剪贴板代码:int main()
{
int my_var = 2;

return 0;
}
这样提升速度....
而的确在大多数情况下....都会使用Macro处理一些常数

但另方面黎讲
Macro作为非C++语言的一部分(更清楚的讲法系...Macro系用来指挥编译器运作的语言)
所以使用Macro的地方都很难debug...或者不能debug
因为经过了编译时的第一阶段...
所有Macro都全部被消灭...即系话之后的debug并不包括Macro在内

结论来看....如果只系使用简单Macro...系可以在完全不影向效能的情况下...令程式码更美观看易读
但太复杂的话...除了没甚么实质作用外....还会令程式码更难找出问题

作者: Susan﹏汪汪   发布时间: 2014-05-19

例如
复制内容到剪贴板代码:#define MIN(a, b) ((a)<(b)?(a):(b))

int main()
{
int my_var = MIN(1, MIN(2, MIN(3, MIN(4, MIN(5, MIN(6, MIN(7, 8)))))));

return 0;
}
只有变成咁
复制内容到剪贴板代码:int main()
{
int my_var = ((1)<(((2)<(((3)<(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))?(3):(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))))?(2):(((3)<(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))?(3):(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))))))?(1):(((2)<(((3)<(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))?(3):(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))))?(2):(((3)<(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))))?(3):(((4)<(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))))?(4):(((5)<(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8)))))?(5):(((6)<(((7)<(8)?(7):(8)))?(6):(((7)<(8)?(7):(8))))))))))))));
return 0;
}

作者: Susan﹏汪汪   发布时间: 2014-05-19

复制内容到剪贴板代码:// test.cpp
#include "test.h"

int main()
{
int my_var = test::foo(); //直接指定使用namespace test内的foo()定义
return 0;
}
test::foo(); <<唔洗指明系namespace既范围入面?
呢度:: 同
for(vector<int>::iterator it = ivector.begin();
既:: 系唔系一样? 姐系下面果果系指明入vector入面其中一个function - iterator , 而it就系类似foo(x)中既x?

btw, u let me know what exactly is include means thx!

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 08:33 PM 发表
// test.cpp
#include "test.h"

int main()
{
int my_var = test::foo(); //直接指定使用namespace test内的foo()定义
return 0;
} test::foo();
理解上系咁
复制内容到剪贴板代码:namespace std
{
template<
class T,
class Allocator = std::allocator<T>
> class vector
{

typedef /* someting here */ iterator; //这里定义一个type

iterator begin(); //这里定义一个function

}
}
所以我们要使用vector<int>里的iterator
就要call
std::vector<int>::iterator
如果前面已经用左using namespace std;
就可省略为vector<int>::iterator

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 於 2014-4-22 08:33 PM 发表 例如#define MIN(a, b) ((a)
本人唔系太明点用macro 做野

我岩岩打
引用:#define MIN(a, b) ((a)<(b)?(a)b))
#include
using namespace std;

int main()
{
int my_var = MIN(1, MIN(2, MIN(3, MIN(4, MIN(5, MIN(6, MIN(7, 8)))))));
cout << my_var;
return 0;
}
佢只系出1

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 08:42 PM 发表

本人唔系太明点用macro 做野

我岩岩打



佢只系出1
因为果堆野的计算结果系1

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 08:42 PM 发表

本人唔系太明点用macro 做野
总之Macro只系做替换
例如
复制内容到剪贴板代码:#define UNSIGNED unsigned
#define INT int
#define UINT UNSIGNED INT

int main()
{
UINT my_var = 0;
return 0;
}
会变成
复制内容到剪贴板代码:int main()
{
unsigned int my_var = 0;
return 0;
}

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 Susan﹏汪汪 於 2014-4-22 08:46 PM 发表


总之Macro只系做替换
例如#define UNSIGNED unsigned
#define INT int
#define UINT UNSIGNED INT

int main()
{
UINT my_var = 0;
return 0;
}会变成int main()
{
unsigned int my_var ...
ok明白明白!! got it!!
姐系将几个或者一个symbol 变成1个symbol 表示
方便自己 got it! 好兴奋呀 thx
而::姐系call前面果组野入面既其中一个function

[ 本帖最后由 懒羊x 於 2014-4-22 08:58 PM 编辑 ]

作者: 懒羊x   发布时间: 2014-05-19

Macro更精彩的玩法可以系咁
复制内容到剪贴板代码:#include <cstdint>
#include <cfloat>
#define __MERGE(_a, _b) _a##_b
#define __LOG(_b) __MERGE(log, _b)
#define __LOG_B __LOG(_DBL_RADIX)

uintmax_t __LOG_B(uintmax_t a)
{
if (a == 0) throw std::logic_error("log(0)");
double _a = (double)a;
return (uintmax_t)(((*(int64_t*)&_a) >> (DBL_MANT_DIG - 1)) - (DBL_MAX_EXP - 1));
}
最终会变成
复制内容到剪贴板代码:uintmax_t log2(uintmax_t a)
{
if (a == 0) throw std::logic_error("log(0)");
double _a = (double)a;
return (uintmax_t)(((*(int64_t*)&_a) >> (53 - 1)) - (1024 - 1));
}
所以正确来说....呢个function系 log2( 数字 )

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 Susan﹏汪汪 於 2014-4-22 08:57 PM 发表
Macro更精彩的玩法可以系咁#include
#include
#define __MERGE(_a, _b) _a##_b
#define __LOG(_b) __MERGE(log, _b)
#define __LOG_B __LOG(_DBL_RADIX)

uintmax_t __LOG_B(uintmax_t a)
{
if (a == 0) ...
小弟未学到上面果组library既代码, sorry睇唔明>< 迟d我学到再番黎睇
另小弟想请教, 点解我call out 一个vector时
例如
引用:vector<int>ivector(10,5);cout<< ivector[1]
果时唔系出1, 而系出一组类似地址既野既?呢个小弟未上网搵过, 为求方便, 希望唔好见怪><

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 08:54 PM 发表


ok明白明白!! got it!!
姐系将几个或者一个symbol 变成1个symbol 表示
方便自己 got it! 好兴奋呀 thx
而::姐系call前面果组野入面既其中一个function
vector系 C++ standard library(简写std) 里面的动态阵列

但所有C++的新手不应该咁快就接触std
因为只系C++的pointer都有排你学

作者: Susan﹏汪汪   发布时间: 2014-05-19

所以楼主....你慢慢操熟左pointer先再讲std

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 Susan﹏汪汪 於 2014-4-22 09:02 PM 发表
所以楼主....你慢慢操熟左pointer先再讲std
冇问题, 因为其实我系跟个网慢慢咁学

如果可以而且唔怕我烦希望你可以留line比我 ,当有野果时请教

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 09:04 PM 发表
冇问题, 因为其实我系跟个网慢慢咁学

如果可以而且唔怕我烦希望你可以留line比我 ,当有野果时请教
有野系到问就ok

作者: Susan﹏汪汪   发布时间: 2014-05-19

不过楼主....
唔好以为C++的pointer只系简单的东西

基本上....大多数没接触过pointer的程式员...不论有几资深...都会认为pointer系深奥的东西
而通常熟习pointer的程式员...已经有能力任意玩弄任何程式语言

简单黎讲...了解pointer就是要了解电脑

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 Susan﹏汪汪 於 2014-4-22 09:10 PM 发表
不过楼主....
唔好以为C++的pointer只系简单的东西

基本上....大多数没接触过pointer的程式员...不论有几资深...都会认为pointer系深奥的东西
而通常熟习pointer的程式员...已经有能力任意玩弄任何程式语言

...
咁其实pointer系一个concept定一个工具 or 一组function=0=?

作者: 懒羊x   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 09:33 PM 发表

咁其实pointer系一个concept定一个工具 or 一组function=0=?
系语言的功能

作者: Susan﹏汪汪   发布时间: 2014-05-19

引用:原帖由 懒羊x 於 2014-4-22 09:33 PM 发表

咁其实pointer系一个concept定一个工具 or 一组function=0=?
例如汪汪#18果段code
复制内容到剪贴板代码:#include <cstdint>
#include <cfloat>
#define __MERGE(_a, _b) _a##_b
#define __LOG(_b) __MERGE(log, _b)
#define __LOG_B __LOG(_DBL_RADIX)

uintmax_t __LOG_B(uintmax_t a)
{
if (a == 0) throw std::logic_error("log(0)");
double _a = (double)a;
return (uintmax_t)(((*(int64_t*)&_a) >> (DBL_MANT_DIG - 1)) - (DBL_MAX_EXP - 1));
}
实际上只有double和return 果两行系重点
其他的例如#include #define if果行都没有任何实际意义 (P.S. if果行只系用来debug)

所以基本上
咁写已经可以正常运作
复制内容到剪贴板代码:uintmax_t log2(uintmax_t a)
{
double _a = (double)a;
return (uintmax_t)(((*(int64_t*)&_a) >> (53 - 1)) - (1024 - 1));
}
呢到虽然只系pointer的运用
但如果要写得出呢几行都起码要学三五七年啦

作者: Susan﹏汪汪   发布时间: 2014-05-19