秋招C++八股--关键字、运算符相关(持续更新)

1 strlen和sizeof区别?

strlen和sizeof是C++中用于处理字符串和计算内存大小的操作。

  1. strlen函数:
    • strlen函数是C标准库中的函数,用于计算字符串的长度,即字符串中字符的个数(不包括结尾的空字符'\0')。
    • 它接受一个以'\0'结尾的字符数组作为参数,并返回该字符串的长度
    • strlen函数通过遍历字符数组来计算长度,直到遇到空字符为止。
  2. sizeof运算符:
    • sizeof是C++中的运算符,用于计算对象或类型的大小,即占用的内存字节数
    • 它可以用于计算各种类型的大小,包括基本类型、自定义类型和数组等。
    • sizeof运算符在编译时求值,返回的结果是一个常量表达式,在编译阶段就可以确定。

区别:

  • strlen用于计算以'\0'结尾的字符数组的长度,即字符串的长度,返回的是字符个数。
  • sizeof用于计算对象或类型的大小,返回的是占用的内存字节数。

需要注意的是,strlen计算的是字符串的实际长度,而sizeof计算的是类型或对象占用的内存大小。因此,在使用时要注意选择适当的操作,以满足具体的需求。

int main()
{
	const char* str = "name"; 4
	sizeof(str); // 取的是指针str的长度,是8
	strlen(str); // 取的是这个字符串的长度,不包含结尾的 \0。大小是4
	return 0; 
}

2 C++ 中的异常处理方法

在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保 证绝对的稳定,常见的异常有: 数组下标越界

除法计算时除数为0 动态分配空间时空间不足 ... 如果不及时对这些异常进行处理,程序多数情况下都会崩溃。

(1) try、throw和catch关键字

代码中,对两个数进行除法计算,其中除数为0。可以看到以上三个关键字,程序的执行流程是先执行 try包裹的语句块,如果执行过程中没有异常发生,则不会进入任何catch包裹的语句块,如果发生异 常,则使用throw进行异常抛出,再由catch进行捕获,throw可以抛出各种数据类型的信息,代码中使 用的是数字,也可以自定义异常class。**catch根据throw抛出的数据类型进行精确捕获(不会出现类型 转换),如果匹配不到就直接报错,可以使用catch(...)****的方式捕获任何异常(不推荐)。**当然,如果catch了异常,当前函数如果不进行处理,或者已经处理了想通知上一层的调用者,可以在catch里面再throw异常。

#include <iostream>
using namespace std;

int main() {
    double m = 1, n = 0;
    try {
        cout << "before dividing." << endl;
        if (n == 0)
            throw - 1;    // 抛出int型异常
        else if (m == 0)
            throw - 1.0;  // 抛出double型异常
        else
            cout << m / n << endl;
        cout << "after dividing." << endl;
    }
    catch (double d) {
        cout << "catch (double)" << d << endl;
    }
    catch (...) {
        cout << "catch (...)" << endl;
    }
    cout << "finished" << endl;
    return 0;
}

(1) 函数的异常声明列表

有时候,程序员在定义函数的时候知道函数可能发生的异常,可以在函数声明和定义时,指出所能抛出 异常的列表,写法如下:

int fun() throw(int,double,A,B,C){...}; 

这种写法表名函数可能会抛出int,double型或者A、B、C三种类型的异常,如果throw中为空,表明不 会抛出任何异常,如果没有throw则可能抛出任何异常

3.C++ 标准异常类

bad_typeid:使用typeid运算符,如果其操作数是一个多态类的指针,而该指针的值为 NULL,则会拋出此异常,例如:

#include <iostream>
#include <typeinfo>

using namespace std;

class A {
public:
    virtual ~A();
};

int main() {
    A* a = nullptr;
    try {
        cout << typeid(*a).name() << endl; // Error condition
    } catch (bad_typeid) {
        cout << "Object is NULL" << endl;
    }
    return 0;
}

bad_cast:在用 dynamic_cast 进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常 bad_alloc:在用 new 运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常

out_of_range:用 vector 或 string的at 成员函数根据下标访问元素时,如果下标越界,则会拋出此异常

3 初始化和赋值的区别

初始化是在对象创建时进行的赋值,使用构造函数或拷贝构造函数;赋值是在对象已存在的情况下进行的重新赋值,使用赋值操作符函数。两者的调用方式和对象状态有所不同。

class A {
public:
	int num1;
	int num2;
public:
	A(int a = 0, int b = 0) :num1(a), num2(b) {};
	A(const A& a) {};
	//重载 = 号操作符函数 
	A& operator=(const A& a) {
		num1 = a.num1 + 1;
		num2 = a.num2 + 1;
		return *this
	};
};
int main() {
	A a(1, 1);
	A a1 = a; //拷贝初始化操作,调用拷贝构造函数 
	A b;
	b = a;//赋值操作,对象a中,num1 = 1,num2 = 1;对象b中,num1 = 2,num2 = 2 
	return 0;
}
#23届找工作求助阵地##秋招#
C++ 校招面试精解 文章被收录于专栏

适用于 1.C++基础薄弱者 2.想快速上手C++者 3.秋招C++方向查漏补缺者 4.秋招C++短期冲刺者

全部评论
已关注,莫辜负😘
点赞
送花
回复
分享
发布于 2023-06-25 09:00 安徽

相关推荐

4 11 评论
分享
牛客网
牛客企业服务