So I got this code from my teacher but it doesn`t work combined with other code, it works only if it is separatly in a project. The whole code works great, less this part
Depending on compiler, C-style string literals may be allocated in readonly memory. Thus they are const char[N+1] (N is the string length) (which is implicitly convertible to const char* because of array to pointer decay).
The problem you're having is that it's illegal to drop const qualifiers (with the exception of the infamous const_cast or equivalent C-style cast).
Since you're only reading from sir, you can fix this by making sir be const char* instead, which doesn't violate const:
class student {
...
student(int = 8, const char* =" "); // problem solved
...
};
student::student(int nr_marks, const char* sir) : // remember to change it here as well
marks(nr_marks)
{
strcpy(name, sir);
}
About string literals:
In C, string literals are of type
char[], and can be assigned directly to a (non-const)char*. C++03 allowed it as well (but deprecated it, as literals are const in C++). C++11 no longer allows such assignments without a cast.
Your teacher is possibly more versed in C or "dated" C++. As stated above the language (= modern C++) disallows the assignment / initialization of a char* from a string literal.
Workarounds:
Use char const * as type for the parameter. That's the reasonable solution when the string is not modified (why would you modify a string literal??)
Not recommended. When you need to write to that pointer: Store (a copy of) the string literal as a (non const) char[] and reference that. Issues: thread safety; side effects; why would you want to do this??
Better. If you need to write to / change the string: use std::string.