C++知识点,关键字inline ,String,强制类型转化

简介: 🐰inline 函数🐰string类🌸1.字符串的定义:🌸2.访问字符串🌸3.字符串的连接🌸4.字符串的比较🌸5.字符串长度的计算🌸6.字符串的交换🌸7.字符串数组🐰static_cast强制类型转化

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰inline 函数

🐰string类

🌸1.字符串的定义:

🌸2.访问字符串

🌸3.字符串的连接

🌸4.字符串的比较

🌸5.字符串长度的计算

🌸6.字符串的交换

🌸7.字符串数组

🐰static_cast强制类型转化


🐰inline 函数

inline 函数由inline关键字定义,引入inline函数的主要原因是用它替代C中复杂不易维护的宏函数

编译器在编译阶段完成对 inline 函数的处理,即对 inline 函数的调用替换为函数的本体。但 inline 关键字对编译器只是一种建议,编译器可以这样去做,也可以不去做。从逻辑上来说,编译器对 inline 函数的处理步骤一般如下:

(1)将 inline 函数体复制到inline函数调用处;

(2)为所用 inline 函数中的局部变量分配内存空间;

(3)将 inline 函数的的输入参数和返回值映射到调用方法的局部变量空间中;

(4)如果 inline 函数有多个返回点,将其转变为 inline 函数代码块末尾的分支(使用goto)。

事例(求0~9的平方和):

1. inline int inlineFunc(int num) {  
2.   if(num>9||num<0) return -1;  
3.   return num*num;  
4. }  
5. 
6. int main(int argc,char* argv[]) {
7.     int a=8;
8.     int res=inlineFunc(a);
9.     cout<<"res:"<<res<<endl;
10. }
11. inline 之后的main()函数代码类似于如下形式:
12. int main(int argc,char* argv[]) {
13.     int a = 8; {  
14.         int _temp_b=8;  
15.         int _temp;  
16.         if (_temp_q >9||_temp_q<0) _temp = -1;  
17.         else _temp =_temp*_temp;  
18.         b = _temp;  
19.     }
20. }

使用inline能够使程序运行速度更加快,但是代码空间似乎增大了,就是实现空间换取时间

使用方法:

函数定义时,在返回类型前加上关键字 inline 即把函数指定为内联,函数申明时可加也可不加。但是建议函数申明的时候,也加上 inline,这样能够达到"代码即注释"的作用。

关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。

如下风格的函数 Fun 不能成为内联函数:

1. inline int Fun(int x, int y);      inline 仅与函数声明放在一起
2. int Fun(int x, int y){ }

而如下风格的函数 Fun 则成为内联函数:

1. int Fun(int x, int y);
2. inline int Fun(int x, int y) { }

inline 与函数定义体放在一起,inline 是一种"用于实现的关键字",而不是一种"用于声明的关键字"。

🐰string类

string类是一种顺序表的结构,元素是char类型的字符

🌸1.字符串的定义:

 

string类的常用构造函数:

string  str——构造空的string类对象,即空字符串

string str(str1)——str1 和 str 一样

string  str("ABC")——等价于 str="ABC"

string  str("ABC",strlen)——等价于 "ABC" 存入 str 中,最多存储 strlen 个字节

string  str("ABC",stridx,strlen)——等价于 "ABC" 的stridx 位置,作为存到str字符串开头,中,最多存储 strlen 个字节

string  str(srelen,'A')——存储 strlen 个 'A' 到 str 中

🌸2.访问字符串

1. #include<iostream>
2. using namespace std;
3. string str=" abc”;
4. 
5. 和字符数组一样,字符串可以直接用下标进行访问
6. char ch=str[0];
7. cout<<ch<<endl;

🌸3.字符串的连接

字符串string a=“abcd”,string b=“efgh”,string c;

连接a和b赋值给字符串c只需要c=a+b.

🌸4.字符串的比较

(1) 当s1 < s2时,返回负数;

(2) 当s1 == s2时,返回值 = 0;

(3) 当s1 > s2时,返回正数。

即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:

“A”<”B”

“a”>”A”

“computer”>”compare”

事例(比较字符串的大小):

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5.     string arr="abcd";
6.     string brr(arr,0);
7.     cout<<brr<<"\n";
8.     if(arr>brr)
9.     {
10.         cout<<"大于"<<"\n";
11.     }
12.     else if(arr<brr)
13.     {
14.         cout<<"小于"<<"\n";
15.     }
16.     else
17.     {
18.         cout<<"等于"<<"\n";
19.     }
20.     return 0;
21. }
22. 结果:
23. abcd
24. 等于

🌸5.字符串长度的计算

1. str.length()——求字符串长度
2. str.size()——和 length() 一样
3. 
4. string arr="abcd";
5. string brr(arr,0);
6. cout<<arr.length()<<"\n";
7. cout<<arr.size()<<"\n";

🌸6.字符串的交换

1. 这三种都可以 交换 arr 和 brr 的字符串
2. arr.swap(brr)        
3. arr.swap(brr);
4. brr.swap(arr);

🌸7.字符串数组

不仅可以用string定义字符串变量,也可以用string定义字符串数组。

如:string name[5];

定义一个字符串数组,它包含5个字符串元素

string name[5]={″Zhang″,″Li″,″Fun″,″Wang″,″Tan″};

字符数组的注意事项

1.在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量。

2.并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。

3.在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。

4.每一个字符串元素中只包含字符串本身的字符而不包括′\0′。

🐰static_cast强制类型转化

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用

static_cast,但它不能用于两个不相关的类型进行转换

1.  int c=static_cast<int>(a);
2.  int d=static_cast<int>(b);
3. 编译报错 两个不相关的类型就不能进行类型转换
4.  int* e=static_cast<int*>(&b);

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  



相关文章
|
6天前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
13 0
|
2月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
64 4
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
2月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
39 11
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
4月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
87 0
|
4月前
|
存储 NoSQL 索引
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
|
4月前
|
开发工具 数据安全/隐私保护
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
108 0