我是靠谱客的博主 落寞夏天,这篇文章主要介绍引用&指针&const1. malloc 和new 的区别2. 把const 加在指针不同的位置是否有区别;3. const(只读)4. 引用和指针的区别5. 函数传入值参数和传入引用参数有什么区别6. 函数返回是引用和非引用的区别7. 什么时候需要为传入的引用参数加上const8. C++中可以用struct 和class 来定义类型. 这两种类型有什么区别?,现在分享给大家,希望可以做个参考。
目录
- 1. malloc 和new 的区别
- 2. 把const 加在指针不同的位置是否有区别;
- 3. const(只读)
- 4. 引用和指针的区别
- 5. 函数传入值参数和传入引用参数有什么区别
- 6. 函数返回是引用和非引用的区别
- 7. 什么时候需要为传入的引用参数加上const
- 8. C++中可以用struct 和class 来定义类型. 这两种类型有什么区别?
1. malloc 和new 的区别
malloc | new | |
---|---|---|
属性 | C库函数 | C++运算符 |
返回类型 | 失败返回NULL,成功返回申请内存的首地址void*类型(需要强制类型转换) | 失败抛出异常bad_alloc,成功返回对象类型的指针 |
内存分配 | 需要显式指定内存分配的字节数 | 编译器根据类型,自动分配对象大小的内存空间(会调用malloc),自动调用类对象的构造函数,对类对象进行初始化 |
释放内存 | free | delete—调用类的析构函数,调用operator delete函数,调用free函数 |
2. 把const 加在指针不同的位置是否有区别;
- const在解引用符号的左边,那么不能通过这个指针来修改指向的内存,但是指针的指向是可以修改的
- const在解引用符号的右边,那么可以通过这个指针来修改指向的内存,但是指针的指向是不可以修改的
3. const(只读)
对于任何不修改数据成员的函数都应该声明为const成员函数,提高程序可靠性。
不允许把一个const对象的地址赋给一个指向非const对象的指针(不能给修改的机会,可修改的可以给只读,但只读的不能给可修改的)。
-
const 数据成员
在类的成员函数里都只能调用它,不能改变它。 -
const 成员函数
const改变了this的类型,变为指向const对象的指针(所以static 成员函数不能声明为const,因为static成员函数没有this指针给const作转换)。不能修改调用该函数的对象,即只能使用对象的数据成员,不能修改这些数据成员。
在声明和定义的时候都必须加const,调用时不用加。复制代码1
2
3
4
5
6
7
8int A::get_data(void) const {//const 成员函数 return m_data; } //===》》 int A::get_data(const A* const this) const { return m_data; }
-
const 对象
const对象只能调用const成员函数,不能调用非const成员函数。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include <iostream> using namespace std; class A{ private: int m_data; const char m_sex;//const 数据成员 public: A(int data = 0, char sex = 'm'):m_data(data), m_sex(sex){} void set_data(int data){ m_data = data; return ; } int get_data(void) const {//const 成员函数 return m_data; } char get_sex(void) const { return m_sex; } void print() const { cout << "m_data=" << get_data() << endl; cout << "m_sex=" << get_sex() << endl; return ; } }; int main(void){ A a; a.print(); cout << "change data from 0 to 5" << endl; a.set_data(5); a.print(); const A aa;//const 对象 aa.print(); return 0; }
4. 引用和指针的区别
-
引用的本质是指针常量(用的时候理解成别名或者说本体,别管指针),如下
- 复制代码1
2
3
4
5
6
7
8int a = 10; int &p = a; /*====>底层原理:int *const p = &a; p的值初始化之后不可修改,也就是指针指向不可改,也就是引用不可更改,只能绑定一次。*/ p = 11; /* *p = 11;编译器发现p是引用,自动给p解引用。 */
5. 函数传入值参数和传入引用参数有什么区别
- 传入值参数,形参要复制一份实参
- 传入引用参数,函数可以直接访问实参对象,无需复制。
6. 函数返回是引用和非引用的区别
- 函数返回是非引用类型复制代码1
2
3
4
5
6
7
8
9
10
11
12
13#include <iostream> int add(int a, int b){ int sum; sum = a + b; return sum; } int main() { int s; s = add(1, 1); //int temp = sum;s = temp;//函数调用处产生的临时对象temp接住函数的返回值 return 0; }
- 函数返回引用类型时,不会复制返回值,返回的是对象本身。复制代码1
2
3
4
5
6
7
8
9
10
11
12
13#include <iostream> int& add(int a, int b){ int sum; sum = a + b; return sum; } int main() { int s = add(1, 1);//理解成s接住sum本体的值 int &ss = add(1, 1);//理解成ss就是sum本体 return 0; }
7. 什么时候需要为传入的引用参数加上const
- 不会修改所引用的对象
8. C++中可以用struct 和class 来定义类型. 这两种类型有什么区别?
- 如果没有标明成员函数或者成员变量的访问权限级别,在struct
中默认的是public, 而在class 中默认的是private.
最后
以上就是落寞夏天最近收集整理的关于引用&指针&const1. malloc 和new 的区别2. 把const 加在指针不同的位置是否有区别;3. const(只读)4. 引用和指针的区别5. 函数传入值参数和传入引用参数有什么区别6. 函数返回是引用和非引用的区别7. 什么时候需要为传入的引用参数加上const8. C++中可以用struct 和class 来定义类型. 这两种类型有什么区别?的全部内容,更多相关引用&指针&const1.内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复