C++中非类型模板参数中,若指定形参为指针类型为什么不能用字符串字面量进行调用
时间: 2024-02-26 14:56:06 浏览: 73
在 C++ 中,非类型模板参数可以是整数、枚举、指向对象或函数的指针、引用、指向成员对象或成员函数的指针等。当我们指定形参为指针类型时,需要传入一个指向对象或函数的指针作为实参,而不能直接使用字符串字面量进行调用。这是因为字符串字面量在 C++ 中是一个常量字符数组,而不是一个指针,因此无法作为指向对象或函数的指针进行传递。如果需要使用字符串字面量作为实参,可以使用 const char* 类型的指针进行传递,而不能直接使用字符串字面量。
相关问题
使用c++完成如下题目输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。 要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。
以下是使用C++完成题目要求的示例代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
void strmcpy(char* s, char* t, int m) {
strcpy(s, &t[m-1]);
}
int main() {
int repeat;
cout << "请输入repeat的值:";
cin >> repeat;
while (repeat--) {
char t[100], s[100];
int m;
cout << "请输入字符串t和整数m(以空格分隔):";
cin >> t >> m;
strmcpy(s, t, m);
cout << "复制后的字符串s为:" << s << endl;
}
return 0;
}
```
这段代码定义了一个函数`strmcpy`,它的参数是两个字符指针`s`和`t`,分别指向要复制的目标字符串和源字符串,以及一个整型变量`m`,表示从源字符串的第`m`个字符开始复制。在函数中,使用`strcpy`函数将源字符串从第`m`个字符开始的所有字符复制到目标字符串中。在主函数中,首先读入一个整数`repeat`,表示要进行复制操作的次数,然后在循环中读入要复制的源字符串`t`和整数`m`,然后调用`strmcpy`函数,将目标字符串`s`、源字符串`t`和整数`m`作为参数传递进去,函数执行完毕后,目标字符串`s`中存储了从源字符串的第`m`个字符开始的所有字符,最后输出目标字符串`s`即可。
字符串常量做参数形参是什么c++
在C++中,字符串常量做参数形参时,通常会被声明为指向常量字符的指针。也就是说,函数的形参应该是 const char* 类型,这样可以避免在函数内部对字符串常量进行修改。例如:
```c++
void myFunction(const char* str) {
// 不能对 str 进行修改,因为它是指向常量字符的指针
// ...
}
int main() {
myFunction("Hello, world!"); // 字符串常量作为实参
return 0;
}
```
在上面的代码中,`myFunction` 函数的形参 `str` 被声明为 `const char*` 类型,因此不能在函数内部对它进行修改。在 `main` 函数中,我们调用 `myFunction` 函数时,把字符串常量 `"Hello, world!"` 作为实参传入。由于字符串常量本身就是指向常量字符的指针,因此可以直接作为实参传入函数。
阅读全文