首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 流插入和流提取运算符的重载

— 1 — << 运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 提出问题: 那这条语句为什么能成立呢? cout 是什么?...为什么 << 运算符能用在 cout 上呢? 原因: 实际上,cout 是在 iostream 头文件中定义的 ostream 类的对象。...char * s) { .... // 输出s字符串的代码 return *this; } 那么在使用流插入<<运算符时,等价于的形式如下: 01 数据类型是int类型时: std:...:cout << 1; 上面的语句,等价于: cout.operator<<(1); 02 数据类型是字符串类型时: std::cout << "hello"; 上面的语句,等价于: cout.operator..."); — — 假定我们要想把某个对象里的内容进行打印输出,那么我们可以重载 ostream 类的流插入 << 运算符。

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ Primer Plus习题及答案-第十七章

    编译器将类似cout cout.operator调用与具有相同参数类型的函数原型匹配。 5....而cin.get(ch);不忽略空格和换行符,且第一次输入的回车键,也会被cin.get(ch);捕捉到,因此ct2的值应为9。打印内容如下: ct1 = 5; ct2 = 9 9....index; i++) pc[i]->writeall(fout);// fout ofstream connected to output file 【注意】: 对于这个练习,应使用文本I/O,而不是二进制...该程序将键盘输入读取到一个由string对象组成的vector中,将字符串内容(而不是string对象)存储到一个文件中,然后该文件的内容复制到另一个由string对象组成的vector中。...Store的构造函数应接受一个指定ifstream对象的参数,而重载的operator( )(const string &)应指出要写入到文件中的字符串。

    3.1K30

    c++系列之二 指向成员函数的指针(烧脑)

    现在,我们所能知道的是,编译器准确地知道要调用哪个函数。这就是所谓的“静态绑定”。因为成员函数可以静态绑定(并不是总能静态绑定,待会儿讨论),所以它们的地址是在编译阶段决定的(同样并不是永远如此)。...偏移量 而不是 绝对地址 。...*fptr)(0); // 调用 FooDerived::f(),而不是 Foo::f() //偏移量 Bar obj; ( obj....字符串目的地;4. 字符串来源。上述代码中字符串来源是两个字符串常量"Strings "和"concatenated!",而成员函数指针数组被用来根据菜单选项执行相应的打印动作。...成员函数调用和 this 指针 现在我们回到文章最开始的地方。为什么一个空指针也能调用成员函数?

    3.1K20

    【C语言】字符和字符串函数(2)

    它可以按照我们给出的分隔符来分割我们的字符串,现在我们先来了解一下它的原型: char * strtok ( char * str, const char * sep);    它的第一个参数就是一个带有分隔符的字符串的首地址...,而第二个参数就是装有分隔符的字符串的首地址,strtok函数就可以根据我们给出的分隔符将字符串分隔开来    在分隔一次过后,它会返回这个被分隔下来的字符串的首地址,要注意一个点:在使用函数时,strtok...会修改数组的内容,把分隔符改成\0,所以一般会创建源数据的副本,然后用副本使用这个函数,并且调用一次这个函数只会分隔一个分隔符,如果有多个分隔符就要多次调用    并且第一次分隔传参时,第一个参数为要分隔的字符串的地址...strtok,并且将它赋值给p指针,随后我们调用strtok的第一个参数就只需要传空指针,就可以写在循环的调整部分    而中间的循环结束条件为什么设置为不等于NULL呢?...个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的    strerror函数就可以将错误对应的错误信息字符串的地址返回,可以用%s的形式将错误信息打印出来    我们可以试着打印前

    10510

    熬夜整理的万字CC++总结(二),值得收藏

    0.为什么使用指针 假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a(...在数据传递时,如果数据块较大,可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。...思考如下问题: int a = 0xaabbccdd; unsigned int *p1 = &a; unsigned char *p2 = &a; //为什么*p1打印出来正确结果?...printf("%x\n", *p1); //为什么*p2没有打印出来正确结果? printf("%x\n", *p2); //为什么p1指针+1加了4字节?...这就意味着:这种数据传递是单向的,即从调用者传递给被调函数,而被调函数无法修改传递的参数达到回传的效果。

    1.3K20

    【指针合集】全方位理解C语言指针

    str1和str2都是数组,当用相同的常量字符串去初始化不同的数组的时候就会开辟不同的空间。而str3和str4指向的同一个常量字符串。...可以这么理解:str1和str2是可以修改数组中的元素的,如果不同数组间的修改会相互影响,那岂不是乱遭了。而str3和str4是不可以被修改的,那么让它们两指向同一块空间也是完全没有问题的。...的指针ppfunarr void(*(*ppfunarr)[5])(const char*) = &pfunarr; } 还可以再绕下去的 15.回调函数 回调函数就是一个通过函数指针调用的函数,如果你把函数的指针...回调函数不是由该函数的实现直接调用,而是再特定的事件或条件发生时由另一方的调用,用于对该事件或条件进行响应。...sizeof内,所以会变成数组首元素的地址,而指针的大小根据选择的是32位还是64位而不同。

    25230

    初识C语言·字符(串)函数

    至于为什么加const,因为我们只是计算长度,不希望字符串的内容被修改,所以加个const修饰一下,结合前面的递归知识,这个是很好理解的。...因为代码量多了点,先看为什么返回值是p1而不是dest,因为根据cpiusplus的记叙我们返回的应该是最开始的目的字符串的地址,所以我们先暂存一下,在返回。...参数有两个,两个字符串的地址,参数要用const修饰的话,就全都用const修饰咯,毕竟我们只是想要找位置,并不是想要修改。...根据Return Value我们可以知道,如果找到了就返回匹配成功的那个首元素地址,没有成功就返回NULL,那你可能问了,成功找到的话是返回字符串的首元素地址吗?那打印的不就是字符串2了吗?...,我们可以看到0对应的就是No error,再次验证了0是正常,因为返回类型是char*的,也就是那串字符串的首元素地址,所以我们用%s打印。

    8210

    C语言学习——sprintf函数详细解释及其用法

    函数功能: 把格式化的数据写入某个字符串 头文件:   stdio.h 函数原型:   int sprintf( char *buffer, const char *format, [ argument...] … ); 参数列表:   buffer:char型指针,指向欲写入的字符串地址。   ...返回值:字符串长度(strlen) 相关函数:   int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format, [argument...如果你想看si 的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):   sprintf(s, “%04X”, (unsigned short)si);...”%u”把他们打印出来:   sprintf(s, “%u”, &i);   不过通常人们还是喜欢使用16 进制而不是10 进制来显示一个地址:   sprintf(s, “%08X”, &i

    10.9K20

    初识C语言·指针(1)

    不是有4个字节吗,怎么打印了一个地址,这是因为打印地址的时候只打印低地址。 不信?你试试呢~ 所以当我们知道了第一个字节的地址,要访问后面的地址,那不就顺腾摸瓜吗?...int a = 10; int* p = &a; 这里的p就是一个指针变量,因为a是整型类型的,所以p是int* ,同理,如果a是char类型的,p的类型就是char*,那按道理来说,p存了a的地址,打印出来的结果应该是一样的...,我们传过去一个常量字符串“abc”,传过去的实际上是abc的首元素地址,所以我们使用char*的指针来接收。...肯定有人问了,为什么在打印*p的前面加一个打印666呢?因为当函数test的栈帧被释放之后,可能还没来得及利用,你马上调用,说不定是行得通的,但是不要以为写对了,是运气比较好而已。...而数组传参因为传的是首元素地址,所以也是传址调用,读者可自行进行一下实验。 感谢阅读!

    5610

    指针详解(3)

    在使用上,由于pstr存放的是字符串第一个字符的地址所以 对pstr解引用就可以打印第一个字符,打印整个操作符只需提供首元素的地址,使用%s就可以打印出来。...所以在使用时一般会加上const进行修饰,这样当试图对常量字符串进行修改系统就会直接报错,否则不加上const修饰时,当试图对常量字符串内容进行修改时只有在程序运行起来才会报错。...int main() { const char* pstr = "hellow hehe"; *pstr = 'a';//这里再编译器里直接报错了 return 0; } 一到剑指offer里关于字符串的题目..."; const char* str3 = "hello bit."; const char* str4 = "hello bit....* 数组指针变量的使用 数组指针变量使用来存放数组地址的,通过& + 数组名获得数组的地址,而不是直接通过数组名赋值。

    7610

    【C进阶】——详解10个C语言中常见的字符串操作函数及其模拟实现

    把字符串的首字符地址传给函数,用指针接收,用该指针遍历字符串,如果指针指向的内容不是’\0’,计数器++,指针继续向后移动,直至遇到’\0’停止,返回计数器的值。...那我们将它的返回值以字符串形式打印出来应该就是helloworld,虽然后面还有,但我们知道打印到’\0’就结束了嘛,我们看看是不是: 我们现在拿到了被分割符分开的第一个字串helloworld,如果我们还行拿到后面的...当我们想从上次的第一个分隔符的位置继续向后分割字符串拿到strtok时,我们需要再次调用strtok函数,但是这次第一个参数我们应该NULL,为什么呢?...3次,那以后操作其它的字符串,是不是调用次数也要变啊。...接下来我们再次调用函数就需要传空指针了,而恰好调整部分就是str = strtok(NULL, p),这样正好符合我们的需求。 然后判断部分为str !

    88510

    【C指针详解】进阶篇

    应该不是的,pstr是一个字符指针,是用来存放字符的地址的,而"hello bit."是一个字符串,即使我们想把它放到pstr中,也是不可行的。 那这句代码的结果是啥呢?...const char* pstr = “hello bit.”; ——本质上是把字符串 “hello bit.” 首字符 h 的地址放到了pstr中,使得指针pstr指向该字符串。...是一个常量字符串,而常量字符串是不能被修改的,在内存中仅保留一份。 这也是有时候在代码最前面加上const的原因(const char* str3 = “hello bit.”;)。...而指针str3和str4指向的是同一个常量字符串,它们存储的都是字符串"hello bit."的首字符’h’的地址,所以str3和str4本质上是一样的 2....实际上: &arr 表示的是整个数组的地址,而arr是数组首元素的地址。 所以,arr和&arr打印出来才会不一样。

    26210

    深度刨析程序中的指针

    是常量字符串,所以我们在前面加了const修饰 printf("%s\n",str); return 0; } 本质就是把常量字符串hello world的首元素的地址放到了str当中,也就是将常量字符串的首元素...str1和str2都是数组,当用相同的常量字符串去初始化不同的数组的时候就会开辟不同的空间。而str3和str4指向的同一个常量字符串。...可以这么理解:str1和str2是可以修改数组中的元素的,如果不同数组间的修改会相互影响,那岂不是乱遭了。而str3和str4是不可以被修改的,那么让它们两指向同一块空间也是完全没有问题的。...回调函数不是由该函数的实现直接调用,而是再特定的事件或条件发生时由另一方的调用,用于对该事件或条件进行响应。...提问:为什么呢? 回答:Void*指针 是无具体类型的指针。Void* 类型的指针可以接任意类型的地址(这种类型的指针是不能直接解引用操作的,也不能直接进行指针运算的)。

    7110

    Linux进程控制

    那么为什么给父进程返回的就是子进程的pid,而给子进程返回的就是0呢? 就好比孩子只能有一个亲生的父亲,而一个父亲可以拥有很多亲生孩子,每个孩子都是独立不同的。...进程终止 退出码 在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是不写都可以...int execl(const char *path, const char *arg, …); 第一个参数是说如何找到程序,第二个参数是我们在命令行解释器怎么调用该程序就怎么写,最后用NULL结尾。...int execvpe(const char *file, const char *argv[], …,char *const envp[]); 这个参数就不说了,都说过了。...我们输入一个字符串是abc,然后会按回车,也就是说实际上是abc\n,如果我要在打印信息%s后面加一个\n那么就会多出一行,不加容易出现缓冲区不刷新问题,所以我们要去除输入末尾的\n。

    2.9K00
    领券