c++(7)

1. 类型检查更严格

  举个例子,我们都知道,当一个变量定义为const类型后,这个变量的值是不能被改变的,但是在C中,我们可以拐着弯去修改const类型变量的值,如下:

int main(int argc, char *argv[])
{
    const int a = 100;
    //a = 200; // error
    int *p = &a;
    *p = 200;
    printf("a=%d\n", a); // a=200
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  对于const类型变量a,我们无法直接再去给它赋值200,但是我们可以定义一个指针变量p来保存a的地址,通过*p来修改a的值,在C里面这样是可以做到的,这叫明修栈道暗度陈仓。我们再来详细分析一下这个过程,a是个const int类型,那么取地址后就变成了const int *类型,也就是说相当于把const int *类型的变量赋给了int *类型,把const给干掉了,所以可以对*p进行赋值了。C中可以随便赋值,这就导致了不严谨。 
  在C++里,int *p = &a编译则不会通过,因为无法将const int *类型的变量赋给了int *类型,所以既然设定了a为const类型的变量,它就不会让你有修改的机会。C++不喜欢强转,C++会认为你设计有问题。还有个小细节,在定义a的时候,C中可以不赋初值,系统会给一个随机值,而C++中强制你在定义的时候要初始化,这一点在语言的层面上做的就比较友好了。 
  再举个常见的例子,我们知道malloc函数返回的是void *类型,在C中,我们可以直接将返回值赋给char *的变量,但是在C++中,必须转换成char *类型才可以,如下:

char *p = malloc(100); // C
char *p = (char *)malloc(100); // C++
 
 
  • 1
  • 2
  • 1
  • 2

2. 增加bool类型

  C语言中是没有bool类型的,C中表示真假用的是0和非0。C++中有bool类型,可以使用true和false来表示真和假。但是在C++中,也可以将0和非0赋给bool类型的变量,这点其实C++做的不太严谨,既然有了bool类型,个人觉得只能用true和false去赋值会更好,可读性也更强。 
  bool类型其实说白了就是个枚举,C中虽然没有,但是我们可以用枚举来定义这个类型。

#include <stdio.h>

typedef enum BOOL
{
    FALSE,TRUE
}Bool;

int main(int argc, char *argv[])
{
    Bool b = FALSE;
    if(!b)
    {
        printf("b value is false\n");
    }
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

  C中必须使用typedef才可以直接使用Bool,否则需要加enum来定义,如enum BOOL b = FALSE;。在C++中,枚举类型可以直接用来定义变量,不需要再加上enum关键字,也不需要使用typedef来重新命名。

3. 真正的枚举

  这是什么意思呢?C中的枚举算不上真正的枚举,C 语言中枚举的本质就是整型,枚举变量可以用任意整型来赋值。而C++中枚举变量,只能用被枚举出来的元素去初始化。比如我们定义一个枚举类型:

enum SEASON
{
    Spring,Summer,Autumn,Winter
};
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

在C中我们可以:

enum SEASON s;
s = Spring; //ok
s = 100; //ok
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

但是在C++中:

SEASON s;
s = Spring; //ok
s = 100; //error
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  说个题外话,枚举除了列举一些固定的值以外,还能充当宏的作用。还是上面的例子,如果我们把SEASON去掉,完全可以将枚举中的值作为宏来处理,因为枚举中的值默认是从0开始,也可以手动赋不一样的值,如下:

#include <iostream>
enum
{
    Spring = 100,
    Summer = 20,
    Autumn = 50,
    Winter = 250
};

int main(int argc, char *argv[])
{
    printf("%d %d %d %d\n",Spring, Summer, Autumn, Winter);
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这样会将四个值打印出来,可以完美替代宏去操作了,这也是枚举的一个妙用吧。

4. 表达式可以被赋值

在C中,表达式是不可以被赋值的,但是在C++中,某些表达式是可以被赋值的。

int main()
{
    int a, b;
    a = b = 5; // ok both in c & c++
    (a = b) = 100; // ok only in c++
    printf("a=%d b=%d\n",a, b);

    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  在C中,表达式的值是可以赋值给其他变量的,比如a=b=5;是将5赋给b,再将表达式b=5的值赋给a,所以a和b都等于5。但是C中不能将100赋值给表达式(a=b),虽然该表达式的值是a的值,但是不允许这样操作,可在C++中是允许的,最后会打印出a=100 b=5。

5. 输入与输出

  在C中我们一般用scanf和printf来输入和输出,在C++中使用cin和cout来输入和输出,这两个有啥区别呢?从语言的角度来说,scanf和printf是函数,cin和cout是类对象,他们有相同的功能而已。举个与C对比的例子:

int main(int argc, char *argv[])
{
    int a = 25;
    float b = 1234.567;

    printf("%5d\n%6.2f\n", a, b);
    cout<<setw(5)<<a<<endl<<setw(6)<<setprecision(2)<<setiosflags(ios::fixed)<<b<<endl;

    printf("%x\n%o\n%d\n", a, a, a);
    cout<<hex<<a<<endl<<oct<<a<<endl<<dec<<a<<endl;
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  使用setw()函数来设定域宽,使用setprecision和setiosflags来设定小数位。使用hex、oct和dec来表示十六进制、八进制和十进制。关于输入输出后面再细写吧。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一门linux下c++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++在linux下从事网络通讯领域/网络服务器的开发和架构工作。这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。 这门课程要求您具备下面的技能:(1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;(2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:(1)项目本身是一个极完整的多线程高并发的服务器程序;(2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;(3)根据收到的包的不同来执行不同的业务处理逻辑;(4)把业务处理产生的结果数据包正确返回给客户端;本项目用到的主要开发技术和特色包括:(1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;(2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;(3)线程之间的同步技术包括互斥量,信号量等等;(4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;(5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;(6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等;
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值