Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++; 我是C++世界的新手(OOP)。 我现在正在学习课程和指针,但我被卡住了,希望有人能向我解释我遗漏了什么,或者应该更深入地了解以扩大我的理解_C++_Class_Pointers_Constants - Fatal编程技术网

如何在C++; 我是C++世界的新手(OOP)。 我现在正在学习课程和指针,但我被卡住了,希望有人能向我解释我遗漏了什么,或者应该更深入地了解以扩大我的理解

如何在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

示例1工作:

#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;
}