优秀的编程知识分享平台

网站首页 > 技术文章 正文

我的C++基础知识学习小总结(c++入门知识点)

nanyue 2024-08-16 00:42:46 技术文章 9 ℃

一、new和malloc的区别

1、new和delete配对,释放数组需要用delete[]。new和delete实际上调用了malloc和free,另外调用了类的构造函数和析构函数。

2、malloc和free配对,malloc返回的是void指针,需要强转。

3、new申请的内存保存在堆中,malloc申请的内存保存在自由存储区。

二、C++运算符

1、取模操作符:%

2、逻辑否、与、或:!, &&, ||

3、三元操作符:

c = (a>b) ? a : b;

4、按位与、或、非

& AND 逻辑与 Logic AND

| OR 逻辑或Logic OR

~ NOT 对1取补(位反转)Complement to one (bit inversion)

5、按位移:

<< SHL 左移Shift Left

>> SHR 右移Shift Right

想要一起学习C++的可以加群248894430,群内有各种资料满足大家

三、&: 取地址运算符、定义变量引用

&操作符用于取地址时的用法是:int* x=&y;。

然而,另外一种用法是定义变量别名,这种用法不能和取地址简单等同。用于传递函数输入参数时很好理解,但定义变量时容易引起理解错误,特别是和指针的区别:

从内存的角度看,指针和引用是完全不同的。指针,内存要为它分配一个存储空间。引用,内存不分配空间的,引用只是一个别名。我认为就是在符号表里增加一个标志而已,对于语句int &y=x; (&x=&y)为true。

实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?答案是“用适当的工具做恰如其分的工作”。当重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。如果操作符[]返回一个指针,那么后一个语句就得这样写:

*v[5] = 10;

但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化),否则会报编译错误。

(2)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

以下示例程序中,k被初始化为i的引用。语句k = j并不能将k 修改成为j 的引用,只是把k的值改变成为6。由于k是i的引用,所以i 的值也变成了6。

int i = 5;

int j = 6;

int &k = i;

k = j; // k 和i 的值都变成了6;

(3)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

以下的写法将地址指向一个位置的内存,是错误的。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)

char *pc = 0; // 设置指针为空值

char& rc = *pc; // 让引用指向空值

(4)“sizeof 引用”得到的是所指向的变量(对象)的大小,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。

(5)引用只能指向一个实际的变量,不能指向指针或引用

(int*) * p1; // p1是指针的指针

(int*) & p2; // p2是指向整型指针的引用

引用不能指向指针或引用!

(int&) * p3; // ERROR: 不能有指向引用的指针,因为引用只是一个别名

(int&) & p4; // ERROR: 不能有指向引用的引用,因为引用只是一个别名

(6)指针和引用在内部的实现其实是没多大的区别的。但使用时有些地方是要注意的。因为引用具有对象行为,这一点很重要。引用复制时会调用对象的复制函数,在涉及多态时,这地方很容易出错。

想要一起学习C++的可以加群248894430,群内有各种资料满足大家

class A{...};

class B:public A{...};

void f(A&a1,A&a2)

{

a1=a2;//此处调用的只有基类A的复制函数,而B部分不会被进行复制,之将导致数据的不一致(即B部分的数据没有被复制);

a1.fun();

}

四、关于const

一般的const变量:

下面两个声明都指向一个const int类型的指针,指针所指向的内存不能被修改,但指针可以指向另一个内存:

const int *p;

int const *q;

int类型的const指针应该这样声明。指针所指向的内存可以被修改,但指针不能指向另一个内存

int * const r= &n;

声明一个指向const int类型的const指针:

const int * const p=&n;

const在函数声明中的含义:

const int& SetPoint(const int& param) const

第一个const:

函数的返回值限定为const,即返回值不能被修改。const int a=SetPoint(...) a在此之后便不能被修改。

第二个const:

指函数的形参为const类型,函数体内不能被修改.

第三个const:

表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。

类的const和static成员变量的初始化:

对于static成员变量,如果同时是const的,可以在类定义中初始化,否则只能在类定义外部初始化。

非static的const成员变量只能在构造函数的初始化列表中初始化。(ClassName():m_1(1){};)

五、一些数据类型和变量赋值语法

1、union 中的所有被声明的元素占据同一段内存空间,其大小取声明中最长的元素的大小。union 的用途之一是将一种较长的基本类型与由其它比较小的数据类型组成的结构(structure)或数组(array)联合使用。

2、long double和float变量的赋值方法:

3.14159L // long double

6.02e23f // float

3、容易引起理解错误的定义语句:int* p,q;

第一眼看去,好像是p和q都是int*类型的,但事实上,只有p是一个指针,而q是一个最简单的int型变量。同时定义两个指针的语法是:int *p1, *p2;

4、定义一个指向int[4]数组的指针变量

int (*p)[4]=RollNum;

这里,p被声明为一个指向一个4元素(int类型)数组的指针。

5、未指定size情况下,char数组的大小由初始化字符串决定:

我们可以用下面两种方法的任何一种来初始化字符串mystring:

char mystring [ ] = { 'H', 'e', 'l', 'l', 'o', '/0' };

char mystring [ ] = "Hello";

在两种情况下字符串或数组mystring都被定义为6个字符长(元素类型为字符char):组成Hello的5个字符加上最后的空字符('/0')。在第二种用双引号的情况下,空字符('/0')是被自动加上的。两种情况下sizeof应该都是6,strlen都是5。

想要一起学习C++的可以加群248894430,群内有各种资料满足大家

六、常用的几个标准C++函数

1、cout和cin的用法:

cout << "xxx" << endl;

cin >> "yyy";

2、常用的字符串函数:

strcat //字符串拼接

strcpy

strncpy

strcmp //字符串比较,相同返回0

七、switch-case的写法

switch (expression)

{

case constant1:

block of instructions 1

break;

case constant2:

block of instructions 2

break;

.

.

.

default:

default block of instructions

}

小结完!感谢大家阅看!

想要一起学习C++的可以加群248894430,群内有各种资料满足大家

最近发表
标签列表