记录C++学习中出现的一些问题、注意事项

自己C++除了跟着老师学之外主要是看的b站,黑马程序员C++视频。这次复习主要是看的课程的文字内容进行复习,然后顺便整理了一下其中的问题。大一新生再加之自己菜鸡一枚,所以学的不怎么深入,只是浅层的学习。一个文章记录一下基础学习中遇到的问题。

https://blog.csdn.net/ClaireSy/article/details/108422945
部分内容直接复制的这个,自己目前看了基础入门和核心编程中的前半部分。

1、#define 宏常量: #define 常量名 常量值

结尾不要加分号,否则会报错
define方法和const方法中,此语句写在main函数内外均可。



2、short long 直接就是数据类型 ,不需要再加int。short==short int


3、char ch = ‘a’;

字符型变量,单引号,单引号里面只能有一个字母。
若打成双引号,报错。
若打了多个字母,最后一个字母为所存储的。在这里插入图片描述
字符串的话应该用string,用之前需要include string。或者用char a[]=“hello world”


4、switch语句


int main() {

	//请给电影评分 
	//10 ~ 9   经典   
	// 8 ~ 7   非常好
	// 6 ~ 5   一般
	// 5分以下 烂片

	int score = 0;
	cout << "请给电影打分" << endl;
	cin >> score;

	switch (score)
	{
	case 10:
	case 9:
		cout << "经典" << endl;
		break;
	case 8:
		cout << "非常好" << endl;
		break;
	case 7:
	case 6:
		cout << "一般" << endl;
		break;
	default:
		cout << "烂片" << endl;
		break;
	}

	system("pause");

	return 0;
}

此段代码中,10、9均会输出经典。输入9后,直接执行9之后的语句。输入10后,执行为空。则执行下一句,,并跳出。
使用switch应记得break,否则将每个都执行一次。

2021.3.31凌晨,补充----switch default语句。

#include<iostream>
using namespace std;
int main() 
{
	int a;
	cin >> a;
	switch (a)
	{
	case 1:
		cout << "1" << endl;
		break;
	case 2:
		cout << "2" << endl;
		break;
	default:
		cout << "00" << endl;		//只要输入的不是1或者2,就都执行这句。
		break;
	}
	return 0;
}

如图,default也相当于一种case,就是输入的数字不满足任何上述情况时所执行的。理解为if语句中的else。


5、goto语句


跳出嵌套循环,break只能跳出一次。

 goto FLAG;
 FLAG:
{
xxxx
}

后面需要加引号
大括号加不加都不报错,此处依旧存疑,百度没有找到答案,自己理解下路感觉没什么区别。期待大佬解答

6、一维数组数组名

数组名地址就是a[0]的地址。
可以利用size of相除,求出来数组长度。

	//1、可以获取整个数组占用内存空间大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
	cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
	cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;

直接输出数组名,得到的是数组首个元素的地址。
输出后续元素的地址,需要用&取址。

cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;

7、值传递

void swap(int num1, int num2)
{
	cout << "交换前:" << endl;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout << "交换后:" << endl;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;

	//return ; 当函数声明时候,不需要返回值,可以不写return
}

int main() {

	int a = 10;
	int b = 20;

	swap(a, b);

	cout << "main中的 a = " << a << endl;
	cout << "main中的 b = " << b << endl;

	system("pause");

	return 0;
}

此函数中,改变的是形参而不是实参数。所以main函数中的a b并没有发生交换。如果想达到交换的目的,则需要在函数中加上&。将void swap(int num1, int num2)改为void swap(int &num1, int &num2)


8、所有指针类型在32位操作系统下是4个字节


9、const修饰指针

int main() {

	int a = 10;
	int b = 10;

	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int * p1 = &a; 
	p1 = &b; //正确
	//*p1 = 100;  报错
	

	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int * const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确

    //const既修饰指针又修饰常量
	const int * const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误

	system("pause");

	return 0;
}

10、利用指针访问数组

int main() {

	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

	int * p = arr;  //指向数组的指针

	cout << "第一个元素: " << arr[0] << endl;
	cout << "指针访问第一个元素: " << *p << endl;

	for (int i = 0; i < 10; i++)
	{
		//利用指针遍历数组
		cout << *p << endl;		//p的话存储着地址,一个的大小是4,所以加1就是移动4个字节,就可以p++实现数组的遍历
		p++;
	}

	system("pause");

	return 0;
}


11、函数地址传递


//地址传递
void swap2(int * p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

	swap2(&a, &b); //地址传递会改变实参

12、引用做函数参数

//3. 引用传递
void mySwap03(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

作用同地址传递,但是用起来更简单。

13、函数默认参数

int func2(int a = 10, int b = 10);
int func2(int a, int b) {
	return a + b;
}

在定义函数时候就可以将参数赋值。

14、函数重载

指多个函数,函数名相同,但根据传入数据的不同,执行不同的代码。

//函数重载需要函数都在同一个作用域下
void func()
{
	cout << "func 的调用!" << endl;
}
void func(int a)
{
	cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
	cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
	cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
	cout << "func (double a ,int b)的调用!" << endl;
}

//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
//	cout << "func (double a ,int b)的调用!" << endl;
//}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++编程,有一些实用的注意事项可以帮助你编写更高效、可维护和安全的代码。以下是几个关键点: 1. **类型转换**:使用`static_cast`, `dynamic_cast`, `const_cast`, 和 `reinterpret_cast`时要小心,确保类型转换的正确性和意图。滥用类型转换可能导致运行时错误或性能损失。 2. **内存管理**:手动管理内存(使用new, delete,指针等)时要避免内存泄漏和悬挂指针。使用智能指针(如`shared_ptr`, `unique_ptr`, 或`std::optional`)可以简化内存处理。 3. **异常处理**:尽量遵循"异常不应被忽视"的原则,用`try-catch`块捕获并处理可能的异常。同时,避免在finally块释放资源,因为这可能导致资源在异常发生后未得到正确的清理。 4. **命名规范**:遵循一致的命名约定,比如成员变量使用小驼峰式(`camelCase`),函数和类使用大驼峰式(`PascalCase`)。 5. **模板编程**:C++模板可以生成灵活的代码,但过度使用可能导致代码复杂度增加。确保模板参数的数量适,并为模板提供明确的文档。 6. **RAII(Resource Acquisition Is Initialization)**:利用RAII原则,确保在对象生命周期结束时自动释放资源,例如文件、锁或动态分配的内存。 7. **范围-based for循环**:对于迭代容器,使用范围-based for循环比传统的迭代器更简洁易读。 8. **STL**:充分利用标准模板库(STL),它提供了高效的数据结构和算法,可以提高代码质量。 9. **避免全局变量**:尽可能减少全局变量,它们增加了耦合度和测试的复杂性。 10. **代码复用**:合理地设计类和模块,以促进代码的复用和模块化。 相关问题: 1. 何为RAII原则? 2. 使用范围-based for循环有何优点? 3. C++为什么要避免全局变量?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值