如何在C++; 我是C++世界的新手(OOP)。 我现在正在学习课程和指针,但我被卡住了,希望有人能向我解释我遗漏了什么,或者应该更深入地了解以扩大我的理解
示例1工作:如何在C++; 我是C++世界的新手(OOP)。 我现在正在学习课程和指针,但我被卡住了,希望有人能向我解释我遗漏了什么,或者应该更深入地了解以扩大我的理解,c++,class,pointers,constants,C++,Class,Pointers,Constants,示例1工作: #include <iostream> #include <string.h> using namespace std; class MyClass { private: char* age; public: MyClass(const char* initData) { age = NULL; cout << "In defaul
#include <iostream>
#include <string.h>
using namespace std;
class MyClass
{
private:
char* age;
public:
MyClass(const char* initData)
{
age = NULL;
cout << "In default constructor working on pointers" << endl;
age = new char [strlen(initData)+1];
strcpy(age,initData);
//age = initData;
}
~MyClass()
{
cout << "In destructor working on pointers" << endl;
delete [] age;
}
const char* GetAge()
{
return age;
}
};
int main()
{
//MyClass firstClass(10);
//cout << "First attempt: " ;
//cout << firstClass.GetAge() << endl;
MyClass secondClass("A test from B");
cout << "Second attempt: ";
cout << secondClass.GetAge() << endl;
return 0;
}
#包括
#包括
使用名称空间std;
类MyClass
{
私人:
字符*年龄;
公众:
MyClass(常量字符*初始数据)
{
年龄=零;
cout首先:您不能将常量指针设置为非常量指针,您可以使用const_cast(initData)
来避免这一问题,它在分配给age
时消除了initData
的常量
但我不认为这是你想要实现的
因此,首先,指针只是指向内存-因此,内存必须由指针以外的其他人管理。通常,如果您想引用某个内容或迭代,则只需要一个指针-如果您想成为该内存的所有者,则可能不想使用指针
第二:如果你现在开始学习C++,尝试学习“现代”C++并利用<代码> Smart TypAsdis<代码>(参见智能指针表单)。
经验法则:如果您不一定需要指针(不需要迭代、直接内存访问),请使用按引用
但底线是:您的示例看起来根本不适用于指针。只需存储int值即可
class MyClass
{
private:
int age;
public:
// pass by const reference, this is cheap and good practice
MyClass(const int& initData)
{
cout << "In default constructor working on pointers" << endl;
// here the value of initData is actually copied into age
age = initData;
}
您认为有效的示例不起作用,并且会导致内存损坏。因此,您已经从一个错误的前提开始,没有必要再继续。看起来有必要多花一点时间研究数组、指针和内存分配的基本原理,直到您理解新字符
分配单个char
,因此尝试strcpy()
将空字符串以外的任何内容写入结果会覆盖内存,导致内存损坏。MyClass firstClass(10);
您没有传递指向int
的指针。您传递的是int
。而且,age=initData
正在更改age
指向的位置,而不是它的内容,然后内存泄漏。(除了Sam以前的注释)@SamVarshavchik,谢谢你提供的信息。在第一个示例中,我稍微修改了我的代码,以处理字符串而不是字符,这似乎为我编译并显示了正确的信息。这仍然是错误的吗?我将再次访问/查找指针和常量,以理解我传递这些值时的错误,就像ChrisMM告诉我的那样。是的,第一个e示例现在是正确的。第二个示例不需要指针成员,age
可以只是一个int。不需要new
或delete
任何内容。您好,感谢您的反馈。仅供参考,我知道智能指针,但我仍在学习,还没有涵盖该主题。我试图从基础上理解:)真正有帮助的是什么是你在第一段代码中关于引用运算符的评论。这给了我一个很好的提示,说明了我做错了什么。嘿,Alex,很高兴我的第一部分帮助了你。如果你需要进一步的帮助,请告诉我,我会尝试为你指出正确的方向
#include <iostream>
using namespace std;
class MyClass
{
private:
int* age;
public:
MyClass(const int *initData)
{
cout << "In default constructor working on pointers" << endl;
age = new int;
(*age) = (*initData);
}
~MyClass()
{
cout << "In destructor working on pointers" << endl;
delete age;
}
const int* GetAge()
{
return age;
}
};
int main()
{
int aNum = 10;
MyClass firstClass(&aNum);
cout << "First attempt: " ;
cout << *firstClass.GetAge() << endl;
return 0;
}
#include <iostream>
using namespace std;
class MyClass
{
private:
int* age;
public:
MyClass(const int &initData)
{
cout << "In default constructor working on pointers" << endl;
age = new int;
(*age) = (initData);
}
~MyClass()
{
cout << "In destructor working on pointers" << endl;
delete age;
}
const int* GetAge()
{
return age;
}
};
int main()
{
MyClass firstClass(10);
cout << "First attempt: " ;
cout << *firstClass.GetAge() << endl;
return 0;
}
class MyClass
{
private:
int age;
public:
// pass by const reference, this is cheap and good practice
MyClass(const int& initData)
{
cout << "In default constructor working on pointers" << endl;
// here the value of initData is actually copied into age
age = initData;
}
#include <memory>
#include <iostream>
class test
{
private:
std::shared_ptr<int> age;
public:
// cheap and quick const ref
test(const std::shared_ptr<int>& data)
{
age = data;
}
void print()
{
std::cout << *age << std::endl;
std::cout << "Use count: " << age.use_count() << std::endl;
}
};
int main()
{
// here we store the data
int i = 17;
// here we have the shared_ptr
std::shared_ptr<int> p = std::make_shared<int>(i);
// here we pass it to the object
test t(p);
t.print();
return 0;
}