外贸网站搜索 引擎优化方法,wordpress打造官网,微信小程序开发流程,wordpress 网银作者#xff1a;求一个demo
版权声明#xff1a;著作权归作者所有#xff0c;商业转载请联系作者获得授权#xff0c;非商业转载请注明出处
内容通俗易懂#xff0c;没有废话#xff0c;文章最后是面试常问内容#xff08;建议通过标题目录学习#xff09;
废话不多…作者求一个demo
版权声明著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处
内容通俗易懂没有废话文章最后是面试常问内容建议通过标题目录学习
废话不多说我们直接开始------ 一、const关键字 1、特点 ①用于定义常量表示不可修改的值。 ②可以应用于变量、函数参数、函数返回值、成员函数等。mutable修饰的成员变量可以在const成员函数中被修改。
class MyClass {
private:mutable int value;
public:void modifyValue() const {value 10; // 正确可以在 const 成员函数中修改 mutable 成员变量}
}; ③提高代码安全性和可读性。 2、示例
// 1. const变量
const int MAX_SIZE 100;
// MAX_SIZE 200; // 错误不能修改const变量// 2. const指针
int value 10;
const int* ptr1 value; // 指向const int的指针
// *ptr1 20; // 错误不能通过ptr1修改值
ptr1 nullptr; // 可以修改指针本身int* const ptr2 value; // const指针指向int
*ptr2 20; // 可以修改指向的值
// ptr2 nullptr; // 错误不能修改指针本身// 3. const成员函数
class MyClass {
public:int getValue() const { // const成员函数承诺不修改对象状态return value;// value 10; // 错误不能在const成员函数中修改成员变量}
private:int value 0;
};
二、引用 1、特点 ①引用是给变量取个别名必须初始化且不能重新绑定。 ②没有独立的内存空间与被引用变量共享同一内存。 ③比指针更安全不能为null。 ④常用于函数参数传递和返回值。 2、示例
int main() {int x 10;int ref x; // ref是x的引用ref 20; // 修改ref等同于修改xstd::cout x; // 输出20int y 30;// ref y; // 不是重新绑定而是把y的值赋给ref(即x)// 引用作为函数参数auto swap [](int a, int b) {int temp a;a b;b temp;};int a 1, b 2;swap(a, b); // 直接修改原变量std::cout a b; // 输出2 1
}
三、const引用 1、特点 ①不能通过引用修改被引用的对象。
int num 10;
const int ref num;
ref 20; // 错误不能通过const引用修改被引用的对象
num 20; // 正确直接通过变量名可以修改 ②可以绑定到临时对象、右值。
const int ref1 5; // 合法将const引用绑定到字面量5
const int ref2 int(10); // 合法将const引用绑定到临时对象
int num 10;
int ref3 num; // 合法
int ref4 5; // 错误普通引用不能绑定到右值 ③常用于函数参数避免不必要的拷贝同时防止修改。下面第二条进行了详细解释
#include iostream
#include string
using namespace std;void printString(const string str) {cout str endl;
}
int main() {string s Hello, World!;printString(s);return 0;
} 2、注意:普通函数使用引用传递是为了避免对象拷贝而拷贝构造函数使用引用传递是为了接收要被拷贝的对象并且在函数体内部完成对象的拷贝操作。
#include iostream
using namespace std;class MyClass {
public:int* data;// 构造函数MyClass(int value) {data new int(value);cout Constructor called. endl;}// 拷贝构造函数MyClass(const MyClass other) {data new int(*(other.data));cout Copy constructor called. endl;}// 析构函数~MyClass() {delete data;}
};// 使用const引用作为参数的普通函数
void func(const MyClass obj) {// 函数内部操作cout Value in func: *(obj.data) endl;
}int main() {MyClass obj(10);func(obj);return 0;
}
四、const、引用以及const引用的比较 ①能否修改const变量不能修改引用可以修改const 引用不能修改。 ②能否重新绑定const变量无绑定这一说引用不能重新绑定const引用不能重新绑定。 ③是否需要初始化const变量必须初始化引用必须初始化const引用必须初始化。 ④能否绑定到临时对象const变量无绑定这一说引用不能绑定const引用能绑定到临时对象。 ⑤内存占用const变量有独立内存引用无独立内存const引用无独立内存。 ⑥主要用途const变量用来定义常量引用用来取别名、参数传递const引用安全传递参数。
五、综合应用 示例
#include iostream
#include string
using namespace std;class Student {
public:// const引用参数避免拷贝同时防止修改Student(const string name) : name(name) {}// const成员函数承诺不修改对象状态const string getName() const { return name; }// 返回const引用避免拷贝同时防止外部修改const string getConstRefName() const { return name; }// 返回普通引用允许外部修改string getRefName() { return name; }private:string name;
};void printStudent(const Student s) {cout Student: s.getName() \n;// s.getRefName() NewName; // 错误s是const引用
}int main() {const string name Alice;Student s(name);printStudent(s);// 通过引用修改s.getRefName() Bob;printStudent(s);// 尝试通过const引用修改const string nameRef s.getConstRefName();// nameRef Charlie; // 错误不能通过const引用修改// 临时对象printStudent(Student(Temp));
}
六、constexpr与const区别 1、constexpr 1介绍constexpr是C11新特性用于定义编译器常量和能在编译期求值的函数。 2特点 ①表示值或函数在编译期就能确定。 ②可用于变量、函数、构造函数等。 ③C17引入了if constexpr编译期条件判断。 3用途 ①在编译期完成计算而不是在运行期
constexpr int factorial(int n) {return (n 1) ? 1 : n * factorial(n - 1);
}constexpr int fact5 factorial(5); // 编译时计算120
// 等价于直接写 constexpr int fact5 120; ②比#define宏更加安全。
constexpr int MAX_SIZE 100; // 替代 #define MAX_SIZE 100
int buffer[MAX_SIZE]; // 可用于数组大小 ③可以在编译期构造和初始化对象
class Point {
public:constexpr Point(double x, double y) : x(x), y(y) {}constexpr double getX() const { return x; }
private:double x, y;
};constexpr Point origin(0.0, 0.0); // 编译期构造
constexpr double x origin.getX(); // 编译期调用成员函数 4示例
constexpr int size 10; // 编译期常量
int arr[size]; // 可用于数组大小// constexpr函数
constexpr int factorial(int n) {return n 1 ? 1 : n * factorial(n - 1);
}constexpr int fact5 factorial(5); // 编译期计算 2、constexpr和const区别 ①求值时机const运行时常量也可以是编译期确定constexpr必须是编译期确定。 ②初始化要求const必须初始化constexpr必须用常量表达式初始化可以定义数组、结构体。 ③函数应用const不能保证编译期求值constexpr可以在编译期求值。 ④指针使用const可以修饰指针本身或指向的内容constexpr必须指向编译期确定的内存。 ⑤主要用途const运行时常量保证不变性不能作为模板参数constexpr编译期计算可以作为模板参数。
#include iostream
using namespace std;int main()
{constexpr int num 1 2 3;//constexpr也可换成const这样下面url[num]也不报错int url[num] {1,2,3,4,5,6};//如果上面不写constexpr,直接url[num]则会显示num不可用做常量couts url[1] endl;return 0;
}七、校招面试常问内容
1、const的作用的用法 ①定义常量const int MAX 100。 ②保护函数参数不被修改void func(const int other)。 ③保护类成员不被修改const成员函数。 ④保护指针指向的内容const char* p或char* const p。
2、const指针与指针const的区别
const int* p1; // 指向const int的指针指针可变内容不可变
int const* p2; // 同上等价写法
int* const p3; // const指针指向int指针不可变内容可变
const int* const p4; // 指向const int的const指针都不可变
3、const成员函数的作用是什么能修改成员变量吗 ①不修改对象状态。 ②不能修改非mutable成员变量。 ③可以被const对象调用。
4、指针和引用的区别 ①指针有自己的一块空间而引用只是一个别名。 ②使用sizeof看一个指针的大小x32环境下4字节x64环境下8字节而引用则是引用对象的大小。 ③指针在使用时可以指向其他对象而引用只能是一个对象的引用不能改变指针有多级指针而引用没有多级引用。 ④指针和引用的含义不同指针为整个类型引用只是单纯1. ⑤如果返回动态内存分配的对象或者内存必须使用指针引用可能引起内存泄漏。因为返回动态内存分配的对象时指针可以为null而引用不可以。如果使用动态分配的内存当返回的引用超出作用域无法释放内存造成内存泄漏而指针可以通过delete释放 ⑥作为参数传递的时候指针需要被解引用才能对对象进行操作而直接对引用的修改都会改变引用所指向的对象。*解引用然后才能访问对象因为指针指向内存引用指向对象 5、为什么函数参数常用const引用 ①避免拷贝大对象的开销。 ②防止意外修改传入的参数。 ③可以接受临时对象右值。
6、函数返回引用时需要注意什么 ①绝不能返回局部变量的引用局部变量在函数内部定义函数结束空间后内存空间被释放。如果返回局部变量的引用在函数外使用该引用访问的是不存在的内存空间。 ②可以返回成员变量、静态变量或传入参数的引用成员变量是类的一部分静态变量在整个程序运行期间都存在传入参数的生命周期在函数调用期间都有效。
7、const引用的特点 ①可以绑定到右值临时对象。 ②可以延长对象的生命周期。 最后如有不足和错误的地方期待私信指正