进步不在于改善已有的东西,而是向着将要产生的东西前进。
重学C++_C语言的陷阱到C++的改进
字符语法的常见陷阱
C语言中常见的词法、语法问题
char c1 = 'yes' //正确的
char c2 = “yes” ; //错误的
const char* slash = "/"; //正确的
const char* slash2 = '/'; //错误的
C语言的考虑
- C语言是高级语言中的低级语言,优点是
小巧,高效,接近底层
。 - 缺点是
细节和陷阱比较多
。
C++的思考
- 兼容C语言,同时推出既高效又易于大规模开发的机制,
string类的使用
。
string类的使用
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s1(1, 'yes');
cout << s1 << endl;//s
string s2(3, 'yes');
cout << s2 << endl;//sss
string s3(1, 'y');
cout << s3 << endl;// y
string s4(" /");
cout << s4 << endl;// /
string s5(1, '/');
cout << s5 << endl;// /
string s6("yes");
cout << s6 << endl;//yes
}
C语言数组退化问题
C语言指针和数组问题
问题表现
- 数组在作参数时的退化行为。
问题原因
- 空间上进行节省,精巧的设计使得语言更精巧简单。
C++中的解决方案
- STL容器及引用的使用,实现底层包装,保证效率同时,保证简单安全。
C语言移位运算问题
问题表现
逻辑右移还是算术右移
- 右移只对无符号数
移位操作位数的限制
- 移位数大于0,小于位数
问题原因
- C在设计移位操作时需要考虑整数表示的上下文环境。
C++中的解决方案
bitset
的使用
代码_bitset
的使用
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
bitset<10> priv = 0xff;
bitset<10> P_BAKCUP = (1 << 6);
bitset<10> P_ADMIN = (1 << 7);
cout << priv << endl;
cout << P_BAKCUP << endl;
cout << P_ADMIN << endl;
if ((priv & P_BAKCUP) == P_BAKCUP)
{
cout << "BAKCUP" << endl;
}
if ((priv & P_ADMIN) == P_ADMIN)
{
cout << "ADMIN" << endl;
}
}
C语言强制类型转换问题
问题表现
- 隐藏的bug和陷阱
- 滥用类型转换可能导致灾难性后果,且很难排
问题原因
- 类型转换在底层语言中的运用很广泛,灵活方便
C++中的解决方案
- 分类便于排查隐藏bug,复杂性鼓励减少使用
static_cast
,const_cast
,dynamic_cast
,reinterpret_cast
。
C语言整数溢出问题
问题表现
- C语言中关于整数的表示
- C语言中的整数不等于数学上的整数
问题原因
- 和系统的设计有关系
C++中的解决方案
- 扩展库的使用,如boost库
- https://www.boost.org/
代码_boost库
VS中包含目录(boost库)
工程文件(右键) → 属性 → VC++目录 → 包含目录
boost库示例(文档)
cpp_int
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using namespace boost::multiprecision;
int main()
{
//例子1 - 注释为C语言的实现
//int i = 2147483640;
//for (; i > 0; i++)
//{
// cout << "add" << endl;
//}
// cout << "exit" << endl;
cout << " boost::multiprecision;" << endl;
cpp_int i2 = 2147483640;
for (; i2 > 0; i++)
{
cout << "add" <<i2<< endl;
}
cout << "exit" << i2<<endl;
//例子2 - 注释为C语言的实现
//int a = 500;
//int b = 500;
//int c = 500;
//int d = 500;
//cout << a*b*c*d << endl;
cout << " boost::multiprecision;" << endl;
cpp_int a = 500;
cpp_int b = 500;
cpp_int c = 500;
cpp_int d = 500;
cout << a * b * c * d << endl;
}
C语言字符串典型缺陷
问题表现
\0’
结束符,表达能力的天生缺陷。- 运行效率低
问题原因
- 特殊场景的,有针对性的设计问题。
C++中的解决方案
- C++的string类及一些开源库解决方案
如Redis库的实现:
代码_C
#include <iostream>
using namespace std;
static const int MAX_LEN = 30;
int main()
{
char str1[] = "string";
cout << strlen(str1) << endl; //6
cout << sizeof(str1) / sizeof(str1[0]) << endl; //7
char str2[] = "stri\0ng";
cout << strlen(str2) << endl; //4
cout << sizeof(str2) / sizeof(str2[0]) << endl; //8
char str1A[MAX_LEN] = "stringA";
strcat(str1A, str2);
cout << str1A << endl; //stringAstri
cout << strlen(str1A) << endl; //11
cout << sizeof(str1A) / sizeof(str1A[0]) << endl; //30
}
代码_C++改进
#include <iostream>
#include <string>
using namespace std;
static const int MAX_LEN = 30;
int main()
{
char str1[] = "string";
cout << strlen(str1) << endl; //6
cout << sizeof(str1) / sizeof(str1[0]) << endl; //7
char str2[] = "stri\0ng";
cout << strlen(str2) << endl; //4
cout << sizeof(str2) / sizeof(str2[0]) << endl; //8
char str1A[MAX_LEN] = "stringA";
strcat(str1A, str2);
cout << str1A << endl; //stringAstri
cout << strlen(str1A) << endl; //11
cout << sizeof(str1A) / sizeof(str1A[0]) << endl; //30
cout << "c++改进" << endl;
string sstr1 = "string";
cout << sstr1.length() << endl; //4
cout << sstr1.capacity() << endl;//15
cout << sizeof(sstr1) << endl; //40
cout << "c++改进_sstr2" << endl;
string sstr2 = "stri\0ng";
cout << sstr2.length() << endl; //4
cout << sstr2.capacity() << endl;//15
cout << sizeof(sstr2) << endl;//40
cout << "c++改进_sstr1++++++" << endl;
sstr1 += sstr2;
cout << sstr1.length() << endl; //10
cout << sstr1.capacity() << endl;//15
cout << sizeof(sstr1) << endl;//40
}
Comments | NOTHING