strlen 和 sizeof
char a[] = "Hello";
char *p = a;
cout << sizeof(a) << endl; // 6 数组大小,包括'\0'
cout << sizeof(p) << endl; // 8 指针宽度
cout << sizeof(*p) << endl; // 1 字符大小
cout << strlen(p) << endl; // 5 字符串长度,不包括'\0'
数组退化问题
一般情况:
char a[] = "Hello";
cout << sizeof(a) << endl; // 6字节,包括'\0'
当数组作为函数参数进行传递时:
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4字节而不是100字节
}
用C++实现加法
C语言面向过程:
int add1(int a, int b){
return a + b;
}
C++面向对象:
class ADD{
public:
int operator()(int a, int b){
return a + b;
}
};
函数模板:
template<typename T, typename U>
decltype(auto) add3(T a, U b){
return a + b;
}
Lambda表达式:
auto add4 = [](int a, int b) -> int {
return a + b;
}
编写 strcpy
char *my_strcpy(char *strDest, const char *strSrc) {
assert(strDest != nullptr && strSrc != nullptr);
char *p = strDest;
while (*strSrc != '\0') {
*p++ = *strSrc++;
}
return strDest;
}
strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式。例如 int length = strlen( strcpy( strDest, “hello world”) );
编写 String 类
class String {
public:
// 构造函数(带默认参数的单变量构造函数可以会和默认构造函数产生歧义)
explicit String(const char *str = nullptr) {
if (str == nullptr) {
m_size = 0;
m_data = new char[1];
*m_data = '\0';
} else {
m_size = strlen(str);
m_data = new char[m_size + 1];
strcpy(m_data, str);
}
}
// 拷贝构造函数
String(const String &other) {
m_size = other.size();
m_data = new char[m_size + 1];
strcpy(m_data, other.m_data);
}
// 赋值运算符
String &operator=(const String &other) {
// 检查自赋值
if (this == &other) {
return *this;
}
// 释放原来数据
delete[] m_data;
// 重新申请内存
m_size = other.size();
m_data = new char[m_size + 1];
strcpy(m_data, other.m_data);
// 返回本对象的引用
return *this;
}
std::size_t size() const {
return m_size;
}
private:
char *m_data;
std::size_t m_size;
};