【C++】拾遗

"本文详细介绍了C++编程中如何带参数执行、执行命令行操作并将结果保存,探讨了exit与return的区别,函数接受任意长度参数的方法,以及C++中的'', const*与*const等指针概念。还涵盖了类内typedef、结构体构造函数、模板、迭代等高级主题。"
摘要由CSDN通过智能技术生成

0 前言

  本博客主要记录C++使用过程中的一点偏门问题。

//2022.11.7
之前一直苦于找不到一个很好的C++的参考资料,这里找到一个:

1 带参数执行

  在C/C++中,常用的控制台程序中main函数都是不传参数的,这样相当于无参数执行,但main函数完整的定义结构是有参数的:

int main(int argc, char *argv[]);

其中,argc代表参数的个数(argument count),argv代表各个参数的首地址(一个指针数组)(argument value),而且需要注意的是,argc是传入参数个数+1;argv[0]实际上就是该程序所在地址,只读。
  那这个怎么使用呢?一般是先编译运行,然后在命令行中执行程序时传入参数即可。

附:参考链接

  同样,在python中也有类似的传入参数执行的操作,具体可以看一下这个链接

2 C语言中执行命令行操作并保存到文件

  最近才知道,C语言中的system("pause");等一些类似的语法,实际上就是在命令行中输入引号中的字符串,实现调用系统的一些功能。那能不能使用这个语法来执行一些相对复杂的指令,而且最好是可以将执行结果返回回来。
  保存命令行执行得到的结果一般有两种方式,一种是在文件中写入特定的内容,需要使用到echo指令,使用格式:echo 内容 > 文件路径,举个例子

echo hello "C:\Users\Zeoy\Desktop\1.txt"

上面这个例子是将hello内容写入到一个txt文件中。参考链接
  但其实更常用的是执行完一个指令之后获取其执行结果,这个时候就不需要加echo指令了,直接使用>符号即可。看下面这个例子

ipconfig > C:\Users\Zeoy\Desktop\1.txt

(路径的引号可加可不加)
  上面这个指令实现的是执行ipconfig指令,然后将返回内容写入到txt文件中。参考链接
  不过,需要注意的是,以上两种方式如果指令中有特殊符号的话,需要使用^进行转义。此外,在C语言编写时,如果字符串中有特殊符号,也需要进行转义,但使用的符号是\,所以在C语言中需要进行两次转义:

//命令行中的ipconfig > C:\Users\Zeoy\Desktop\1.txt
char s[50] = "ipconfig > ^\"C:^\\Users^\\Zeoy^\\Desktop^\\1.txt^\"";
system(s);

  脑洞大开:将上面两种操作结合一下,是不是可以实现在C语言中调用python代码执行的结果?这样也就是运行C语言程序要求具有python环境 [狗头]

附:一个讲得比较详细的博文

3 C语言中获取文件自身路径的方法

参考链接

4 exit(0)与exit(1)、return区别

参考链接

5 函数传入任意长度的参数

  众所周知,C++是支持传入默认参数的,但是没办法像MATLAB一样直接传入一个向量。比如在计算一个向量中元素之和时,就会有类似的需求。但经过室友的提醒,发现C++传的参数还可以是STL,如 <vector>,这样就能大致实现上面的需求。下面是一个例子。【来自室友】

#include <iostream>
#include <initializer_list>
#include <vector>
using namespace std;

template <typename T>
void func (initializer_list<T> argList)
{
	vector<T> args = argList;
	cout<< args.size()<< endl;
	if (args.size()>2) cout<< args[2]<< endl;
	for (auto s: args) cout<< s<< ' '; cout<< endl;
}

int main ()
{
	func ({1,2,3,4,5});
	func ({"123","abc"});
	return 0;
}

6 C++中的“\”符号

  C++中使用 \ 进行续行,常见于一些较长的宏定义,一行写不下,为了美观和可读性,强制将其分为两行。

7 const int * 和 int * const 等的区别

参考链接1
参考链接2

  搜索和const int相关的内容时意外找到上面两篇关于区分这些语句的博客,发现他们写得有点模糊,于是和室友一讨论,总结出一条更加容易理解的方式。

  首先需要明确,这种问题大概只有三种情况:指向常量的指针(指针可变,但指向的内容不可变)和指向变量的常指针(指针不可变,但指向的内容可变)以及这两者的叠加(指针和指向的内容都是常量不可变)。

  • 理解方式一:以星号为分界,星号左边是指针指向内容的修饰,且const intint const等价,星号右边是指针的修饰。所以:

    • const int * p:指针指向是一个整形常量,指针可变,指向内容不变;
    • int * const p:指向一个整形变量的常指针,指针不可变,指向的内容可变;
  • 理解方式二:从左往右看,遇到一个int const or const int表示指向变量的类型,遇到一个*,表示加一层可变指针,遇到一个* const,表示加一层常量指针。【这种理解方式比较适合理解多重指针的情况】

虽然把这个问题暂时性整明白了,但是个人觉得没必要细究这些,毕竟不常用,编程不至于此!

一个边角知识点 //2022.12.2
  如果定义一个指针指向一个常量(如 char *s = "Hello"),那么就不能通过该指针来修改该变量,需要注意!

8 类内typedef

  最近看代码看到一个在类内使用typedef的代码,感觉很新奇,找了一些资料,如下。参考链接

  • typedef long INDEXlong这样的类型起别名,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度)
  • C++引入“仅在类内部起作用的类型别名”,其初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。在函数体内部typedef,这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。
  • 如果该语句放在public段中,则可以在类外部使用,而如果放在private段中,则只能在类内使用。举个例子:
class MyClass
{
public:
  typedef long INDEX;
...
};

调用:

MyClass::INDEX usercode;//声明一个变量

9 结构体构造函数

参考链接

10 C++ Template

11 C++中的迭代

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记录无知岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值